希爾排序,也稱遞減增量排序演算法,2023年shell發明。是插入排序的一種高速而穩定的改進版本。
希爾排序是先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
(1)設待排序元素序列有n個元素,首先取乙個整數increment(小於n)作為間隔將全部元素分為increment個子序列,所有距離為increment的元素放在同乙個子串行中,在每乙個子串行中分別實行直接插入排序。然後縮小間隔increment,重複上述子串行劃分和排序工作。直到最後取increment=1,將所有元素放在同乙個子串行中排序為止。
(2)由於開始時,increment的取值較大,每個子串行中的元素較少,排序速度較快,到排序後期increment取值逐漸變小,子串行中元素個數逐漸增多,但由於前面工作的基礎,大多數元素已經基本有序,所以排序速度仍然很快。
1>下面給出乙個資料列:
2>第一趟取increment的方法是:n/3向下取整+1=3(關於increment的取法之後會有介紹)。將整個資料列劃分為間隔為3的3個子序列,然後對每乙個子串行執行直接插入排序,相當於對整個序列執行了部分排序調整。**如下:
3>第二趟將間隔increment= increment/3向下取整+1=2,將整個元素序列劃分為2個間隔為2的子串行,分別進行排序。**如下:
4>第3趟把間隔縮小為increment= increment/3向下取整+1=1,當增量為1的時候,實際上就是把整個數列作為乙個子串行進行插入排序,**如下:
5>直到increment=1時,就是對整個數列做最後一次調整,因為前面的序列調整已經使得整個序列部分有序,所以最後一次調整也變得十分輕鬆,這也是希爾排序效能優越的體現。
/**
* 希爾排序(wiki官方版)
* * 1\. 選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;(注意此演算法的gap取值)
* 2\. 按增量序列個數k,對序列進行k趟排序;
* 3\. 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。
* 僅增量因子為1時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
* * @param arr
* 待排序陣列
*/public static void shell_sort(int arr)
// ...
for (; gap > 0; gap /= 3)
arr[j + gap] = temp;
}} }
以下是希爾排序複雜度:
平均時間複雜度
最好情況
最壞情況
空間複雜度
o(nlog2 n)
o(nlog2 n)
o(nlog2 n)
o(1)
演算法基礎 希爾排序
一 希爾排序 希爾排序,也稱也稱 遞減增量排序演算法 它是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。來自維基百科 下面直接以乙個例子來說明吧!例如,乙個陣列a 為例,個數n 10。第一次 步長gap n 2 10 2 5 這樣原來的陣列可以被劃分為,之後對每個劃分以插入排序的形式互...
基礎演算法 希爾排序
直接插入排序就跟整理撲克牌一樣,每次把一張新的牌插入到已經排好序的牌的合適的位置中。陣列中排序的時候要將之前位置上的數字全部右移動乙個位置,空出來的位置再來放要插入的數字。可以一次性全部右移動乙個位置,也可以這樣,因為要插入的數字在已經排序的區間的右邊 如果要插入的數字左邊的數字比要插入的數字大,那...
Python演算法(基礎) 希爾排序
希爾排序 希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本,該方法的基本思想是 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 增量足夠...