Tải bản đầy đủ (.ppt) (29 trang)

Báo cáo bài thi giữa kì Bộ môn Cấu Trúc Dữ Liệu CÁC VẤN ĐỀ VỀ MẢNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (148.65 KB, 29 trang )

NSN
Bài báo cáo
Nhóm 1
NSN
CÁC VẤN ĐỀ VỀ MẢNG
NSN

Sắp xếp mảng thông thường

Sắp xếp mảng bằng đệ quy

Tìm kiếm trên mảng
NSN
Sắp xếp

Sắp xếp chọn trực tiếp

Sắp xếp chèn trực tiếp

Sắp xếp Bublesort

Sắp xếp Heapsort
NSN
Sắp xếp chọn trực tiếp

Giả sử mảng đã sắp xếp tăng có n phần
tử

Chọn phần tử nhỏ nhất đổi chổ
với phần tử thứ nhất


Từ n-1 phần tử còn lại,ta cùng chọn ra
phần tử nhỏ nhất,đổi chổ cho phân tử thứ
hai

Tiếp tục cho đến hết mảng
NSN
NSN
Code
void ChonTrucTiep(int
a[],int n)
{
int min;
for(int i=0;i<n;++i)
{
min=i;
for(int j=i+1;j<n;++j)
if(a[min]>a[j])
min=j;
if(i!=min)
DoiCho(a[i],a[min]);
}
XuatMang(a,n);
}
void
ChonTrucTiepDeQui(int
a[],int n,int i)
{
int min;
if(i>=n-1) return ;
min=i;

VongLap2ChonTrucTiep
(a,n,min,i+1);
if(i!=min)
DoiCho(a[i],a[min]);
ChonTrucTiepDeQui(a,n,
i+1);
}
NSN
Sắp xếp chèn trực tiếp

Từ phấn tử đầu tiên coi như là một
mảng mới có một phần tử đã có thứ tự

Chèn thêm phần tử thứ 2 vào trướcnếu
nhỏ hơn hoặc sau(nếu lớn hơn) phần
tử thứ nhất để có một mảng hai phấn
tử có thứ tự.

Cứ tiếp tục như thế cho đến hết

Cuối cùng ta được một mảng có thứ tự
NSN
4 9 1 3 57
NSN
Code
void ChenTrucTiep(int a[],int n)
{
int x,k;
for(int i=1;i<n;++i)
{

x=a[i];
k=i-1;
while(k>=0 && a[k]>x)
{
a[k+1]=a[k];
k ;
}
if(i!=k+1) a[k+1]=x;
}
XuatMang(a,n);
}
void ChenTrucTiepDeQui(int
a[],int n, int i)
{
if(i>=n) return ;
int x=a[i];
int k=i-1;
VongLap2ChenTrucTiep(a,x,k)
;
a[k+1]=x;
ChenTrucTiepDeQui(a,n,i+1);
}
void VongLap2ChenTrucTiep(int
a[],int x,int &k)
{
if(!(k>=0 && a[k]>x)) return ;
a[k+1] = a[k];
k ;
VongLap2ChenTrucTiep(a,x,k)
;

}
NSN
Bubble Sort

Xét tuần tự từng cặp phần tửmột từ từ
cuối mảng đến đầu mảng

Đổi chổ sao cho phần tử nhỏ hơn
đứng trước phần tử còn lại

Lặp lại quá trình này cho đến khi
không còn việc đổ chỗ hai phần tử

Khi đó ta sẽ cò kết quả là một mảng
được sắp thứ tự
NSN
1
4
2
6
3
8
7
5 1
5
7
8
2
4
3

6
1
2
5
7
8
3
4
6
1
2
3
5
7
8
4
6
1
2
3
4
5
7
8
6
1
2
3
4
5

6
7
8
1
2
3
4
5
6
7
8
NSN
Code
void BubbleSort(int a[],int n)
{
for(int i=0;i<n;++i)
for(int j=n-1;j>=i; j)
if(a[j]<a[j-1])
DoiCho(a[j],a[j-1]);
XuatMang(a,n);
}
void NoiBotDeQui(int a[], int
n, int i)
{
if(i>=n) return ;
VongLap2NoiBot(a,i,n-1);
NoiBotDeQui(a,n,++i);
}
void VongLap2NoiBot(int a[],
int i, int j)

{
if(j<i) return;
if(a[j-1]>a[j])
DoiCho(a[j],a[j-1]);
VongLap2NoiBot(a,i, j);
}
NSN
Heapsort

Giai đoạn1:

Hiệu chỉnh danh sách đã cho thành heap đầu tiên

Kết quả là ta có heap thứ nhất và phần tử đầu tiên
của heap là phần tử có khóa nhỏ nhất

Giai đoạn 2:

B1:Đưa phần tử nhỏ nhất về cuối dãy bằng cách
hoán vị a[0] và a[n-1]

B2:Loại bỏ phần tử hỏ nhất (phần tử ở cuối dãy) ra
khỏi dãy (n=n-1),phần còn lại coi như là một danh
sách mới

B3:Nếu n>0 thì hiệu chỉnh danh sách mới thành một
heap mới bằng cáchxét phần tử đầu tiên x=a[0].Sau
khi hoán vị,tại vị trí mới nếu x còn có các nút con thì
ta điểu chỉnh tiếp.Cứ tiếp tục như thế cho đến khi x
ko còn nút con,lặp lại bước1.Nếu n=0,giải thuật kết

thúc

Ta được mảng sắp theo thứ tự giảm dần
NSN
9 8 12 7 17 6 2 5 3
Heap 1 2 3 6 5 14 9 12 8 7
7 3 6 5 14 9 12 8 2
Heap 2 3 7 6 5 14 9 12 8 2
8 7 6 5 14 9 12 3 2
Heap 3 5 7 6 8 14 9 12 3 2
12 7 6 8 14 9 5 3 2
Heap 4 6 7 9 8 14 12 5 3 2
12 7 9 8 14 6 5 3 2
Heap 5 7 8 9 12 14 6 5 3 2
14 8 9 12 7 6 5 3 2
Heap 6 8 12 9 14 7 6 5 3 2
14 12 9 8 7 6 5 3 2
Heap 7 9 12 14 8 7 6 5 3 2
14 12 9 8 7 6 5 3 2
Heap 8 12 14 9 8 7 6 5 3 2
14 12 9 8 7 6 5 3 2
NSN
Code
void HeapSort(int a[],int n)
{
int r,q;
q=n/2-1;
r=n-1;
while(q>=0)
{

Sift(a,q,r);
q=q-1;
}
DoiCho(a[0],a[r]);
r ;
while(r>0)
{
Sift(a,0,r);
DoiCho(a[0],a[r]);
r ;
}
for(int i=0;i<n-i-1;i++)
DoiCho(a[i],a[n-i-1]);
XuatMang(a,n);
}
NSN
Code
void TaoHeab1DeQui(int a[],int q, int r)
{
if(q<0) return;
Sift1(a,q,r);
q=q-1;
TaoHeab1DeQui(a,q,r);
}
NSN
Code
void TaoHeab234DeQui(int a[], int r)
{
if(r<=0) return;
Sift1(a,0,r);

DoiCho(a[0],a[r]);
r ;
TaoHeab234DeQui(a,r);
}
NSN
Code
void HeabSortDeQui(int a[], int n,int q,int r)
{
TaoHeab1DeQui(a,q,r);
DoiCho(a[0],a[r]);
r ;
TaoHeab234DeQui(a,r);
}
NSN
Code
void Sift1(int a[],int q, int r)
{
int x,i,j;
i=q;
j=2*i+1;
x=a[i];
DeQuiVongWhileTrongSift(a,i,j,r,x);
a[i]=x;
}
NSN
Code
void DeQuiVongWhileTrongSift(int a[], int &i, int &j , int
r,int& x)
{
if(j>=r) return;

if(j<r && a[j]>a[j+1])
j=j+1;
if(x<a[j]) return;
a[i]=a[j];
i=j;
j=2*i+1;
DeQuiVongWhileTrongSift(a,i,j,r,x);
}
NSN
Tìm kiếm

Tìm kiếm tuần tự

Tìm kiếm nhị phân
NSN
Tìm kiếm tuần tự

Cho một mảng chưa có thứ tự

Ta bắt đầu tìm kiếm từ phần tử đầu tiên

Nếu phần tử này không phải ta tìm đến
phần tử kế

Cứ như thế cho đến khi gặp phần tử
cần tìm  tìm kiếm thành công

Hay cho đến khi đi hết mảngkhông
tìm thấy phần tử cần tìm
NSN

1 6 8 12 3 4 9 5 7
Tìm x=3
X=
Tìm kiếm thành
công
Tìm x=10
Hết mảng không tìn
thấy x=10
NSN
Code
int TimKiemTuanTu(int a[],int n)
{
int x;
cout<<"Cho biet phan tu muon tim
kiem : ";
cin>>x;
for(int i=0;i<n;++i)
if(a[i]==x) return i;
return -1;
}

×