希爾排序
希爾排序是插入排序的優化版。
回憶一下插入排序,假如插入排序執行到一半的時候,這時陣列左邊是已經排好序的,而右邊是還沒有排序的。如果有乙個很小的資料項恰好在右邊的位置,這時所有左邊已排好序的陣列都得往右移,騰出空位讓這個小的資料項插入。
希爾排序是在插入演算法的基礎上再次降低交換的次數,以此獲取效能的提公升。
public static void sort(int list)
while(h > 0)
if(i != insert)
} // 完成一輪排序
h = (h - 1) / 3; // 縮小間隔
} system.out.println("共交換:" + swap_count);
}
假如我們待排序的陣列從左至右排列如下,很明顯這是乙個降序排列,現在我們要將它變成公升序排序
看看插入排序怎麼做?
這是插入排序執行到將近一半時,陣列的排序情況,左邊比較齊整的一部分是已排序完成的
每插入乙個資料項至左邊,都將迫使已排序好的陣列整體向右移動,已排好序的陣列越大,移動的代價也將越大
看看希爾排序怎麼做?
以40為間隔排序後,陣列被隔成一堆一堆的區域性有序的排列
以13為間隔排序後,陣列再次被隔成更小的一堆一堆區域性有序的排列
不斷縮小間隔h,直至h=0,排序完畢
陣列被隔成一段一段的區域性有序排列,並且每一段排列也是有序的。
陣列的整體移動就限於這個區域性之中了,不會發生像插入排序那樣將整個已排序陣列全部右移的情況,這樣就較插入排序更進一步減少了交換的次數。
高階排序 希爾排序
希爾排序 實際上是基於插入排序的,在插入排序中相比較的是相鄰的兩個元素,但是如果乙個很小的數在陣列的最右端,而他本應該是在最左端的,這樣的話所有中間的元素都要向右移動一位,並且執行了n次。希爾排序就是首先對大跨度的元素做比較並且進行移動,這樣的久相對有序了,再在這個基礎上進行普通的插入排序,效率就會...
高階排序之希爾排序
希爾排序原理 希爾排序 是d.l.shell與1959年提出的一種排序演算法,在這之前的排序演算法的時間複雜度基本都是o n 2 希爾演算法是第乙個打破這個時間複雜度的演算法。希爾排序是直接插入排序的公升級演算法,其核心思想是讓乙個序列分成若干個子串行,分隔方法是將相隔某個增量的記錄組成自序列,在子...
高階排序之希爾排序
希爾排序 shell s sort 是插入排序的一種又稱 縮小增量排序 diminishing increment sort 是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因d.l.shell於1959年提出而得名。這裡需要注意的是如果希爾增量按照減半的方式去遞減的話...