排序算法-插入排序之希爾排序

希爾排序是插入排序的一種。
首先我們來了解一個定理:交換相鄰元素的任何排序算法平均時間爲O(N^2)。
所以希爾排序通過比較一定間隔的元素來進行工作,各趟距離隨算法減小,最後比較相鄰元素完成排序。也就是說原來的插入排序是相鄰的元素比較,而希爾排序是具有間隔的插入排序,這個間隔就是這個序列。
希爾排序使用增量序列:h1,h2,h3…ht;h1=1。使得每趟排序使數組a[i]<=a[i+hk]。最後一趟使a[i]<=a[i+1]。希爾排序也叫縮減增量排序。
這裏寫圖片描述
增量序列一個流行的序列是Shell(算法創造人)建議建議的,ht=N/2,向下取整,hk=h(k+1)/2,向下取整,一直取到1爲止。例如該數組有10個元素,那麼序列爲:5,2,1。(不要被上面那個圖片誤導)
代碼

public class ShellSort {

    @Test
    public void test(){
        Integer[] array = new Integer[]{10,54,55,47,50,20,41,33,40,70};
        sort(array);
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    public static <T extends Comparable<? super T>> void sort(T[] array){
        int length = array.length;
        T temp = null;
        for(int i = length/2; i >= 1; i /= 2){
            for(int x = i; x < length; x++){
                for(int y = x - i; y >= 0; y -= i){
                    if(array[y].compareTo(array[y+i]) > 0){
                        temp = array[y];
                        array[y] = array[y+i];
                        array[y+i] = temp;
                    }else {
                        break;
                    }
                }
            }
        }
    }
}

希爾排序最好的時間複雜度爲O(N),平均爲O(N^3/2),最差爲O(N^2)。但這一切取決於增量序列,希爾增量序列的時間複雜度最差爲O(N^2),Hibbard序列最差的時間複雜度爲O(N^3/2)。適合小規模數據。
Hibbard增量序列:{1, 3, …, 2^k-1}

發佈了70 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章