shell排序法

somehow1002發表於2017-08-15

原理

  Shell排序法又稱為縮小增量排序法,也屬於插入排序類的演算法,是對直接插入排序的一種改進。
  其基本思想就是:將需要排序的序列劃分為若干個較小的序列,對這些序列進行直接插入排序,通過這樣若干次操作可使需要排序的資料基本有序,最後再使用一次直接插入排序。這樣,首先對數量較小的序列進行排序,最後對基本有序的序列進行排序,從而使整個排序過程的效率得到提升。

實現

void shellSort(int a[],int n)
{
    int i,j,gap,tmp;
    for(gap=n/2;gap>0;gap/=2)//步長逐次減半
    {
        for(i=gap;i<n;i++)//迴圈內為一次gap步長內的排序
        {
            tmp=a[i];
            for(j=i-gap;(j>=0&&a[j]>tmp);j-=gap)//將a[gap]與之前的同組元素一起進行排序
                a[j+gap]=a[j];
            a[j+gap]=tmp;
        }
    }
}

說明

Shell排序法被稱為縮小增量排序法,其排序分組是以增量確定的。隨著排序進行,增量逐漸減少,為1時即完成排序。
Shell排序中的依照增量分組,分組後進行排序,以下為一次排序示例
Shell排序示例
藍線連線起來的屬於一組。每次排序同組元素間進行插入排序。

雖然一遍排序中shell排序是穩定的,但多次排序之後,元素之間的移動可能會改變其順序,因此shell排序是不穩定的
shell排序平均時間複雜度為O(nlgn),其中分組的合理性會對演算法產生重要的影響。

相關文章