數據結構與算法總結1 排序
阿新 • • 發佈:2018-10-29
註意 .com out 數據結構 pan style swa tty pow
排序
1、冒泡排序
核心代碼
它的思想就是,每一次遍歷,往後面添加一個當前最大的元素
。 | 63 | 79 | 98 |
void Bubble_Sort( ElementType A[], int N ) { for ( P=N-1; P>=0; P-- ){ } flag = 0; for( i=0; i<P; i++ ) { /* 一趟冒泡 */ } } if ( A[i] > A[i+1] ) { Swap(A[i], A[i+1]); flag = 1; /* 標識發生了交換 */ if ( flag==0 ) break; /* 全程無交換 */ }
算法分析
最好情況:順序T = O( N )
最壞情況:逆序 T = O( N2 )
穩定
2、插入排序
1 #include <iostream> 2 using namespace std; 3 int main(int argc, char *argv[]) { 4 int a[10] = {7,2,6,1,3,5,9,4,12,51}; 5 int tmp; 6 for(int i=1;i<10;i++){ 7 tmp = a[i]; 8 int j; 9 for(j=i-1;j>=0;j--){ 10 if(tmp<a[j]){ 11 a[j+1] = a[j]; 12 }else{ 13 break; 14 } 15 } 16 a[j+1] = tmp; 17 } 18 for(int i=0;i<10;i++){ 19 printf("%d ",a[i]); 20 } 21 }
算法分析:
最好情況:順序T = O( N )
最壞情況:逆序 T = O( N2 )
2、希爾排序
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int main(int argc, char *argv[]) { 5 int a[11] = {11,7,2,6,1,3,5,9,4,12,51}; 6 int tmp; 7 int D = 11/2; 8 for(;D>=1;D/=2){ 9 for(int i=D;i<11;i+=D){ //?? 10 tmp = a[i]; 11 int j; 12 for(j=i;j>=D&&tmp<a[j-D];j-=D){ 13 a[j] = a[j-D]; 14 } 15 a[j] = tmp; 16 } 17 } 18 for(int i=0;i<10;i++){ 19 printf("%d ",a[i]); 20 } 21 }
定義增量序列DM >DM-1 >...>D1 =1
? 對每個 Dk 進行“Dk-間隔”排序( k = M, M-1, ... 1 )
? 註意:“Dk-間隔”有序的序列,在執行“Dk-1-間隔”排序後,仍然是“Dk- 間隔”有序的
利用Hibbard增量序列、Sedgewick 增量序列可以避免增量不互質造成的問題
1 #include <iostream> 2 #include <vector> 3 #include <cmath> 4 using namespace std; 5 int main(int argc, char *argv[]) { 6 vector<int> Hibbard; 7 int a[11] = {11,7,2,6,1,3,5,9,4,12,51}; 8 for(int i=1;i<=11;i++){ 9 Hibbard.push_back(pow(2, i)-1); 10 if((pow(2, i)-1)>11/2) break; 11 } 12 int tmp; 13 for(int i=Hibbard.size()-1;i>=0;i--){ 14 D = Hibbard[i]; 15 for(int i=D;i<11;i+=D){ //?? 16 tmp = a[i]; 17 int j; 18 for(j=i;j>=D&&tmp<a[j-D];j-=D){ 19 a[j] = a[j-D]; 20 } 21 a[j] = tmp; 22 } 23 } 24 for(int i=0;i<10;i++){ 25 printf("%d ",a[i]); 26 } 27 }View Code
3、堆排序
4、歸並排序 分治思想
5、快速排序
#include <iostream> using namespace std; const int maxn = 100006; int a[maxn]; int cutoff = 2; int n; void swap(int i,int j){ int tmp; tmp = a[i]; a[i] = a[j]; a[j] = tmp; } int Median(int l,int r){ int c = (l+r)/2; int tmp; if(a[l]>a[r]){ swap(l, r); } if(a[l]>a[c]){ swap(l, c); } if(a[c]>a[r]){ swap(c, r); } swap(c, r-1); return a[r-1]; } void Insert_sort(int l, int r){ int tmp; for(int i=l+1;i<=r;i++){ tmp = a[i]; int j; for(j=i-1;j>=0;j--){ if(a[j]>tmp){ a[j+1]=a[j]; }else{ break; } } a[j+1] = tmp; } } void QuickSort(int l, int r){ if(cutoff<=r-l){ int pivot = Median(l, r); //printf("pivot=%d\n",pivot); int i=l, j=r-1; while(1){ while(a[++i]<pivot); while(a[--j]>pivot); if(i<j){ swap(i,j); }else{ break; } } swap(i,r-1); QuickSort(l, i-1); QuickSort(i+1, r); }else{ Insert_sort(l,r); } } int main(int argc, char *argv[]) { cin >> n; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } QuickSort(0,n-1); for(int i=0;i<n;i++){ printf("%d ",a[i]); } } /* 10 4 2 1 6 7 4 9 10 12 6 */
數據結構與算法總結1 排序