排序演算法之希爾排序

weixin_33727510發表於2018-01-17

文中大部分內容為摘抄自網友文章,僅供個人學習和備忘。

希爾排序(Shell's Sort)是插入排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因D.L.Shell於1959年提出而得名。

演算法思想

先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。

演算法步驟

  1. 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列個數k,對序列進行k 趟排序;
  3. 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

演算法穩定性

由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

演算法描述(JAVA)

public void sheelSort(int arr[]){
        int dk = arr.length/2;
        while( dk >= 1  ){
            shellSort(arr, dk);
            dk = dk/2;
        }
    }

private void shellSort(int arr[],int k){
        for(int i = k;i<arr.length;i++){
            if(arr[i] < arr[i - k]){
                int j = i - k;
                int temp = arr[i];
                while(j > -1 && temp < arr[j]){
                    arr[j + k] = arr[j];
                    j -= k;
                }
                arr[j + k] = temp;
            }
        }
    }

參考文章

  1. 八大排序演算法
  2. 希爾排序-百度百科

相關文章