290 likes | 438 Views
Bài báo cáo. Nhóm 1. CÁC VẤN ĐỀ VỀ MẢNG. 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. 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.
E N D
Bài báo cáo Nhóm 1
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
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
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 Sắp xếp chọn trực tiếp
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); } Code
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ự Sắp xếp chèn trực tiếp
4 7 9 1 3 5
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); } Code
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ự Bubble Sort
5 1 1 1 1 1 7 5 2 2 8 7 5 3 3 8 7 5 4 4 8 7 5 5 8 7 6 6 8 7 7 8 8 1 2 2 2 3 3 1 4 4 2 5 2 4 3 3 4 4 6 6 6 6 3 6
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); } Code
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 Heapsort
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); } Code
void TaoHeab1DeQui(int a[],int q, int r) { if(q<0) return; Sift1(a,q,r); q=q-1; TaoHeab1DeQui(a,q,r); } Code
void TaoHeab234DeQui(int a[], int r) { if(r<=0) return; Sift1(a,0,r); DoiCho(a[0],a[r]); r--; TaoHeab234DeQui(a,r); } Code
void HeabSortDeQui(int a[], int n,int q,int r) { TaoHeab1DeQui(a,q,r); DoiCho(a[0],a[r]); r--; TaoHeab234DeQui(a,r); } 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; } 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); } Code
Tìm kiếm tuần tự Tìm kiếm nhị phân Tìm kiếm
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 Tìm kiếm tuần tự
Tìm x=3 Tìm kiếm thành công X= Hết mảng không tìn thấy x=10 Tìm x=10
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; } Code
Mảng đã có thứ tự B1:phạm vi tìm kiếm ban đầu là toàn bộ danh sách B2:Gán ptử x cần tìm là ptử chính giữa gọi là y,so sánh x và y Nếu x=y:kết thúc Nếu x<y thì phạm vi tìm kiếm mới là các phần tử nằm trước y Nếu x>y: phạm vi tìm kiếm là các [hần tử nằm phía sau y B3:Nếu tồn tại phạm vi tìm kiếm mới,lặp lại bước 2,ngược lại,giải thuật kết thúc,tìm kiếm thất bại Tìm kiếm nhị phân
Tìm x=10 10>7 tìm thấy
int TimKiemNhiPhan(int a[],int n,int x,int L,int R) { cout<<"Cho biet phan tu can tim : "; cin>>x; int u=(L+R)/2; if(a[u]==x) return u; if(a[u]>x) return TimKiemNhiPhan(a,n,x,L,u-1); if(a[u]<x) return TimKiemNhiPhan(a,n,x,u+1,R); return -1; } Code