1. 程式人生 > >數據結構與算法總結1 排序

數據結構與算法總結1 排序

註意 .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 排序