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ảngkhô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;
}