排序算法之希爾排序

  閒話很少,先看百度百科是怎麼解釋的:算法

    希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell於1959年提出而得名。shell

    希爾排序是把記錄按下標的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個文件恰被分紅一組,算法便終止。性能

  基本思想是:spa

    先取一個小於n的整數d1做爲第一個增量,把文件的所有記錄分組。全部距離爲d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;而後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量 =1(  …<d2<d1),即全部記錄放在同一組中進行直接插入排序爲止。code

  穩定性:orm

    因爲屢次插入排序,咱們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不一樣的插入排序過程當中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,因此shell排序是不穩定的。htm

  僞代碼:blog

    void ShellPass(SeqList R,int d)排序

    {//希爾排序中的一趟排序,d爲當前 增量
      for(i=d+1;i<=n;i++) //將R[d+1..n]分別插入各組當前的有序區
        if(R[ i ].key<R[i-d].key){
          R[0]=R[i];j=i-d; //R[0]只是暫存單元,不是哨兵
          do {//查找R的插入位置
            R[j+d]=R[j]; //後移記錄
            j=j-d; //查找前一記錄
          }while(j>0&&R[0].key<R[j].key);
            R[j+d]=R[0]; //插入R到正確的位置上
          } //endif
   時間性能:
    1.增量序列的選擇
       shell排序的執行時間依賴於增量序列。
    好的增量序列的共同特徵:
    ① 最後一個增量必須爲1;
    ② 應該儘可能避免序列中的值(尤爲是相鄰的值)互爲倍數的狀況。
    有人經過大量的實驗,給出了較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。
  2.Shell排序的時間性能優於直接插入排序
    希爾排序的時間性能優於直接插入排序的緣由:
    ①當文件初態基本有序時直接插入排序所需的比較和移動次數均較少。    
    ②當n值較小時,n和  的差異也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(
 
)差異不大
    ③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減小,而各組的記錄數目逐漸增多,但因爲已經    按di-1做爲距離排過序,使文件較接近於有序狀態,因此新的一趟排序過程也較快。
    所以,希爾排序在效率上較直接插入排序有較大的改進。
 
   代碼實現:
    
public static void ShellSort(int a[]){
        
        int d1 = a.length/2;
        while(true){   // 直到 d1 ==1 的時候跳出循環
            for(int i =0;i<d1;i++){
                for(int j =i;j+d1<a.length;j+=d1){
                    int temp;
                    if(a[j]>a[j+d1]){
                        temp = a[j+d1];
                        a[j+d1] = a[j];
                        a[j] = temp;
                    }
                }
            }
            if(d1 ==1){
                break;
            }
            d1--;
        }
    }
相關文章
相關標籤/搜索