【資料結構】希爾排序!!!

doctor_xiong發表於2018-01-05
    希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。
    希爾排序是將一組資料進行分組,再將分組的資料進行排序,這樣資料就會逐漸的趨向有序,當分組的個數為1的時候將整個陣列排序一遍,那麼整個陣列就排序好了。
    基本思想:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
    如圖:

這裡寫圖片描述

當進行第一次分組的時候,將第一組資料裡面的元素進行排序,然後進行下一次的排序。

舉個栗子:
這裡寫圖片描述

希爾排序存在的缺陷:

 - 由於希爾排序在分組進行排序的時候進行的搬移資料是隔開的,所以在排序演算法上面是不穩定的。

這裡寫圖片描述

實現程式碼:


void ShellSort(int *arr,size_t size)
{
    if(NULL == arr)
        return ;
    int gap = 3;
    while(gap--)
    {
       for(int i=0;i<gap;i++)
       {
           for(int j=i+gap;j<size;j += gap)
           {
               if(arr[j] < arr[j - gap])
               {
                   int tmp = arr[j];
                   int k = j-gap;
                   while(k >= 0 && arr[k] > tmp )
                   {
                       arr[k+gap] = arr[k];
                       k -= gap;
                   }
                   arr[k+gap]  = tmp;
               }
           }
       }
    }
}
    在這裡gap的取值可以根據處理資料的實際情況來自己設定,一般採取的是折半取值發,即在處理gap的時候   gap = gap>>1;

相關文章