Download - Bài báo cáo
NSN
Bai bao cao
Nhom 1
NSN
CAC VÂN ĐÊ VÊ MANG
NSN
Săp xêp mang thông thương
Săp xêp mang băng đê quy
Tim kiêm trên mang
NSN
Săp xêp
• Săp xêp chon trưc tiêp
• Săp xêp chen trưc tiêp
• Săp xêp Bublesort
• Săp xêp Heapsort
NSNSăp xêp chon trưc tiêp
• Gia sư mang đa săp xêp tăng co n phân tư• Chon phân tư nho nhât đôi chô vơi phân tư
thư nhât• Tư n-1 phân tư con lai,ta cung chon ra phân tư
nho nhât,đôi chô cho phân tư thư hai• Tiêp tuc cho đên hêt mang
NSN
NSNCode
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);
}
NSNSăp xêp chen trưc tiêp
• Tư phân tư đâu tiên coi như la môt mang mơi co môt phân tư đa co thư tư
• Chen thêm phân tư thư 2 vao trươcnêu nho hơn hoăc sau(nêu lơn hơn) phân tư thư nhât đê co môt mang hai phân tư co thư tư.
• Cư tiêp tuc như thê cho đên hêt• Cuôi cung ta đươc môt mang co thư tư
NSN
4 9 1 3 57
NSNCode
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);
}
NSNBubble Sort
• Xet tuân tư tưng căp phân tưmôt tư tư cuôi mang đên đâu mang
• Đôi chô sao cho phân tư nho hơn đưng trươc phân tư con lai
• Lăp lai qua trinh nay cho đên khi không con viêc đô chô hai phân tư
• Khi đo ta se co kêt qua la môt mang đươ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
NSNCode
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 đoan1:
– Hiêu chinh danh sach đa cho thanh heap đâu tiên– Kêt qua la ta co heap thư nhât va phân tư đâu tiên
cua heap la phân tư co khoa nho nhât• Giai đoan 2:
– B1:Đưa phân tư nho nhât vê cuôi day băng cach hoan vi a[0] va a[n-1]
– B2:Loai bo phân tư ho nhât (phân tư ơ cuôi day) ra khoi day (n=n-1),phân con lai coi như la môt danh sach mơi
– B3:Nêu n>0 thi hiêu chinh danh sach mơi thanh môt heap mơi băng cachxet phân tư đâu tiên x=a[0].Sau khi hoan vi,tai vi tri mơi nêu x con co cac nut con thi ta điêu chinh tiêp.Cư tiêp tuc như thê cho đên khi x ko con nut con,lăp lai bươc1.Nêu n=0,giai thuât kêt thuc
• Ta đươc mang săp theo thư tư giam dân
NSN9 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
NSNCode
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);
}
NSNCode
void TaoHeab1DeQui(int a[],int q, int r)
{
if(q<0) return;
Sift1(a,q,r);
q=q-1;
TaoHeab1DeQui(a,q,r);
}
NSNCode
void TaoHeab234DeQui(int a[], int r){
if(r<=0) return;Sift1(a,0,r);DoiCho(a[0],a[r]);r--;TaoHeab234DeQui(a,r);
}
NSNCode
void HeabSortDeQui(int a[], int n,int q,int r){
TaoHeab1DeQui(a,q,r);DoiCho(a[0],a[r]);r--;TaoHeab234DeQui(a,r);
}
NSNCode
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;
}
NSNCode
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
Tim kiêm
• Tim kiêm tuân tư
• Tim kiêm nhi phân
NSN
Tim kiêm tuân tư
• Cho môt mang chưa co thư tư
• Ta băt đâu tim kiêm tư phân tư đâu tiên
• Nêu phân tư nay không phai ta tim đên phân tư kê
• Cư như thê cho đên khi găp phân tư cân tim tim kiêm thanh công
• Hay cho đên khi đi hêt mangkhông tim thây phân tư cân tim
NSN
1 6 8 12 3 4 9 5 7
Tim x=3
X=
Tim kiêm thanh công
Tim x=10
Hêt mang không tin thây x=10
NSNCode
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;
}
NSN
Tim kiêm nhi phân
• Mang đa co thư tư• B1:pham vi tim kiêm ban đâu la toan bô danh sach• B2:Gan ptư x cân tim la ptư chinh giưa goi la y,so
sanh x va y– Nêu x=y:kêt thuc– Nêu x<y thi pham vi tim kiêm mơi la cac phân tư
năm trươc y– Nêu x>y: pham vi tim kiêm la cac [hân tư năm
phia sau y• B3:Nêu tôn tai pham vi tim kiêm mơi,lăp lai bươc
2,ngươc lai,giai thuât kêt thuc,tim kiêm thât bai
NSN
3 4 5 7 8 10 13
Tim x=10
10>7
tim thây
NSNCode
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;
}
The end
Thank you!!!