希爾排序(shell's sort)是插入排序的一種又稱「縮小增量排序」(diminishing increment sort),是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因d.l.shell於2023年提出而得名。
在希爾排序之前的排序演算法時間複雜度都是
void shellsort(sqlist* l)
l->r[j + increment] = l->r[0];//找到插入位置,插入資料
}} } while (increment > 1);
}
希爾排序是在插入排序的基礎上改進的演算法,可以看出do迴圈內的具體操作與插入排序類似,與之不同的是多出了乙個增量increment,幾乎所有的操作都圍繞著這個increment來進行的。
理解increment:increment直白來說就是增量的意思,它決定了每一次對順序表中的多少間隔的元素進行操作,比如,假如線性表的長度是10,那麼第一次increment的值就是4,那麼第乙個比較的元素就是i=incremnt+1=5與i-increment=5-4=1,中間就有4個元素的跨度,突破了簡單的插入排序的乙個跨度的比較,也可以由i-(i-increment)=increment得到,每次比較元素的跨度是increment,再來看最內層的迴圈,假設還是10,那麼這次內層由j=i-increment=1開始,開始於0處的記錄值比較,並不斷向後移動,經過這個內層的迴圈移動,可以確定第i個元素的插入位置。從整體上來看,有三個迴圈,第二個大迴圈的目的是對以increment為增量的兩個元素間進行排序,乙個大迴圈完成後,再繼續縮短increment的值,繼續迴圈,但其實在每乙個大迴圈完成後,這個順序表都是趨向於基本有序的,基本有序的意思就是,小的大部分跑到前面來了,大的大部分跑到後面去了,不大不小的都聚集在中間,這樣越到後面,乙個大迴圈所需要真正進行的排序也就越少了,所以時間複雜度會大大減少,另外這個increment不斷縮短的表示式是可以替換的,需要根據具體情況來選取合適的表示式。
這個演算法的核心思想就是每一次操作乙個固定增量之間的資料,使之大體有序,然後再不斷縮小著個增量,直到最後完全不需要比較了。
在理解這個演算法的時候,只需要每一步都帶上增量操作的意識,打破傳統插入排序的相鄰操作的格式,其真正交換的原理還是和插入排序一樣的。
希爾排序的時間複雜度為o(n^(1.3—2)) 。
資料結構基礎7 2 希爾排序
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因dl.shell於1959年提出而得名。先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 增量足夠 小 時,再對全體元素進行一次直接插入排序。...
資料結構 希爾排序!!!
希爾排序是將一組資料進行分組,再將分組的資料進行排序,這樣資料就會逐漸的趨向有序,當分組的個數為1的時候將整個陣列排序一遍,那麼整個陣列就排序好了。基本思想 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基...
資料結構 希爾排序
1 希爾排序是在直接插入排序的基礎上改良而來的,直接插入排序需要記錄基本有序的情況下才能變得很高效,希爾排序便是採取跳躍分割的策略,將相距 增量 的元素組成乙個子串行,這樣才能保證最後進行直接插入排序時的序列是基本有序的。希爾排序的時間複雜度是 2 希爾排序實現演算法 include include...