插入排序

  插入排序的思想是:每一趟將一個待排序的元素,按其關鍵字值的大小插入到已經排序的部分文件中的適當位置上,直到全部插入完成。這裏介紹三種插入排序方法:直接插入排序、折半插入排序和希爾排序。

直接插入排序

1.算法思想
  直接插入排序的過程是將依次將每個元素插入到一個有序的序列中去。所有元素分爲有序區和無序區,每次從無序區中拿出第一個元素,從後往前(下標遞減)依次與有序區每個元素比較,找到正確的位置,並將元素插入到正確位置上。初始有序區只有一個元素。
2.性能分析
  初始序列正序時效率最高,時間複雜度爲O(n);初始序列無序時效率最低,時間複雜度爲O(n2 )。

這裏寫圖片描述

折半插入排序

1.算法思想
  在查找正確位置時使用折半查找(二分查找),由此進行的插入排序成爲折半插入排序。
2.性能分析
  折半插入排序的空間複雜度爲O(1)。從時間上看,折半插入排序僅減少了關鍵詞的比較次數,而元素的移動次數不變。因此,折半插入排序的平均時間複雜度仍爲O(n2 )。

希爾排序

1.算法思想
  希爾(Shell)排序又稱爲縮小增量排序方法,其基本思想是:把元素按下標的一定增量d分組,對每組元素採用直接插入排序的方法進行排序,然後隨着增量逐漸減少,所分成的組包含的元素越來越多,到d的值減少到1時,整個數據合成爲一組,構成一組有序元素,則完成排序。
2.性能分析
  當正序時效率最高,反序時效率最低。

這裏寫圖片描述

完整代碼

#include<iostream>
using namespace std;

//直接插入排序 
void insert_sort(int a[], int n) {
    int i,j,temp=0;
    for(i=1;i<n;++i){
        j = i-1;
        temp = a[i];
        while(j>=0 && temp<a[j]) {
            a[j+1] = a[j];
            --j;
        }
        a[j+1] = temp;
    }
}

//折半插入排序 
void insert_sort1(int a[], int n) {
    int i,j,low,high,mid,temp=0;

    for( i=1;i<n;++i) {
        temp = a[i];
        low = 0; 
        high = i-1;
        //折半搜索a[i]插入的位置 
        while(low<=high) {
            mid = (low+high)>>1;
            if(temp<a[mid]) high = mid-1;
            else low = mid+1;
        }
        //此時應將a[i]插入到high之後
        //也就是將high之後的有序區的數都往後移動一個位置 
        for(j=i-1;j>high;--j) 
            a[j+1] = a[j];
        //將a[i]插入到high之後    
        a[high+1] =temp;
    }
}

//希爾排序 
void shell_sort(int a[], int n) {
    int i,j,temp=0;
    //選取分量d=n/2 
    int d = n>>1;
    while(d>0) {
        //對每組元素採用直接插入排序 
        for(i=d;i<n;++i) {
            temp = a[i];
            j = i-d;
            while(j>=0 && temp<a[j]) {
                a[j+d] = a[j];
                j -= d;
            }
            a[j+d] = temp;
        }
        //縮小增量 
        d = d>>1;
    }
}

//輸出數組
void print_array(int a[],int n) {
    for(int i=0;i<n;++i){
        cout<<a[i]<<" ";
    }
    cout<<endl;
} 
//測試代碼 
int main() {
    cout<<"Test insert_sort:"<<endl; 
    cout<<endl;
    //直接插入測試數據 
    int a[] = {4,10,6,2,11,9,7};
    int n = 7;
    cout<<"Before sort:";
    print_array(a,n);
    cout<<"After insertion:";
    insert_sort(a,n);
    print_array(a,n);
    cout<<endl;

    //折半插入測試數據 
    int a1[] = {12,5,15,2,1,9,7,11};
    int n1 = 8;
    cout<<"Before sort:";
    print_array(a1,n1);
    cout<<"After binary insertion:";
    insert_sort1(a1,n1);
    print_array(a1,n1); 
    cout<<endl;

    //希爾插入測試數據 
    int a2[] = {7,3,1,12,5,9};
    int n2 = 6;
    cout<<"Before sort:";
    print_array(a2,n2);
    cout<<"After binary insertion:";
    shell_sort(a2,n2);
    print_array(a2,n2); 

    return 0; 
}

測試結果如下:

這裏寫圖片描述

  這裏每個排序算法都用一組不同的測試數據,防止上個算法已經將數組排好序而影響測試結果。

發佈了129 篇原創文章 · 獲贊 45 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章