#排序演算法#【2】直接插入排序、希爾排序

範長法@三月軟體發表於2014-05-27

直接插入排序法


 

  插入排序的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後移動,為最新元素提供插入空間。

  

 

核心程式碼:

//直接插入排序法
void InsertSort(int a[],int n){
    int i,j,k,t;

    for(i = 1 ; i<n;i++){
        k = a[i];

        /*
        第一次比較粗糙的寫法
        j = i-1;
        while(j >= 0 && a[j] > t){
            a[j+1] = a[j];
            j--;
        }*/

        for(j=i-1;j>0 && a[j] >t;--j)
            a[j+1] = a[j];

        a[j+1] = k;
        
    }
}

 

希爾排序法


 

  希爾排序又稱為縮小增量排序,也屬於插入排序類的演算法,是對直接插入排序的一種改進。

      基本思想就是:將需要排序的序列劃分為若干個較小的序列,對這些序列進行直接插入排序,通過這樣的操作可使用需要排序的數列基本有序,最後再使用一次直接插入排序。這樣,首先對數量較小的序列進行直接插入排序可提高效率,最後對基本有序的序列進行直接插入排序,也可提高效率,從而使整個排序過程的效率得到提升。

  

  剛看一遍希爾排序後,基本理解,但是理解的有偏差,應該是根據增量將陣列分成若干個序列,對這些序列進行直接插入排序,但是我理解的是根據增量對每對元素進行比較大小並交換。

 

  

 

  上圖中,當增量為2時,其實是分成兩個序列,然後對這兩個序列進行直接插入排序,而並非只是將下標為0和2、1和3...的進行比較交換。

  上程式碼:

//希爾排序
void ShellSort(int a[],int n){
    int i,j,t,d;

    d = n/2;    //計算第一次分量:總元素數量的一半
    while(d>=1){

        for(i=d;i<n;i++){    //以增量構成序列,進行直接插入排序
            /*
            第一次理解有誤程式碼,可能測試資料碰巧,對有的陣列排序正常
            j = i+d;
            if(j >= n)    break;
            if(a[i]>a[j]){
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }*/

            t = a[i];    //獲取序列中最後一個資料
            j=i-d;        //獲取序列中上一個序列號
            
            //以d為增量,進行直接插入排序
            while(j>=0 && a[j]>t){
                a[j+d] = a[j];
                j-=d;
            }
            a[j+d] = t;

        }

        d/=2;    //增量減半
    }
}

 

 

相關文章