1. 程式人生 > >排序演算法02-希爾排序

排序演算法02-希爾排序

希爾排序的名稱來源於它的提出者希爾,說點題外話,希爾這傢伙運氣還是可以的,這是唯一一個以人名命名的排序演算法(僅對於常規的八大排序演算法);

希爾排序的本質是對於插入排序的改進,插入排序可以理解為增量為1的排序,因為執行N次,都使得陣列arr[0]、arr[1]、。。。arr[N-1]完成排序,可以看出增量為1;而希爾排序是採用的縮減增量排序,在希爾排序中增量的初始值為arr.length/2,然後根據增量進行分組,對分組之後的每一組資料進行插入排序,排序完畢之後令增量減半,直至增量為1,此時希爾排序完畢。

希爾排序的演算法複雜度為O(n^{3/2}),是第一批打破二次屏障的排序演算法之一。

 

鑑於作者的文筆與表達能力有限,下面引入一張圖片,圖片來源於https://www.cnblogs.com/chengxiao/p/6104371.html

 

實現希爾排序的簡單程式如下:

    public static int[] shellSort(int[] arr)
    {
        int j;
        for (int gap = arr.length / 2; gap >= 1; gap /= 2)
            for (int i = gap; i < arr.length; i++)
            {
                int temp = arr[i];
                for (j = i; j >= gap && temp < arr[j - gap]; j -= gap)
                    arr[j] = arr[j - gap];
                arr[j] = temp;
            }
        return arr;
    }