希爾排序(shellsort)

2021-07-03 22:38:37 字數 1740 閱讀 1971

希爾排序(shell sort)是插入排序的一種。又縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因dl.shell於2023年提出而得名。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

1.插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率。

2.但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位。

基本思想:

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d2 < d1重複上述的分組和排序,直至所取的增量 =1( < …< d2 < d1),即所有記錄放在同一組中進行直接插入排序為止。

該方法實質上是一種分組插入方法

比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

一般的初次取序列的一半為增量,以後每次減半,直到增量為1。

給定例項的shell排序的排序過程

假設待排序檔案有10個記錄,其關鍵字分別是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次為:

這裡寫**片

#include

#include

void shellsort(int a, int n);

void array_show(int* arr, int len);

int main(int argc, char* argv)

; array_show(arr, 10);

shellsort(arr, 10);

putchar(10);

array_show(arr, 10);

system("pause");

return0;}

void array_show(int* arr, int len)

}void shellsort(int a, int n)

a[j+step] = temp;}}

}

希爾排序演算法是直接插入排序演算法的一種改進,減少了其複製的次數,速度要快很多。 原因是,當n值很大時資料項每一趟排序需要的個數很少,但資料項的距離很長。當n值減小時每一趟需要和動的資料增多,此時已經接近於它們排序後的最終位置。 正是這兩種情況的結合才使希爾排序效率比插入排序高很多。

由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

希爾排序的時間複雜度與增量序列的選取有關,希爾排序時間複雜度的下界是n*log2n。希爾排序沒有快速排序演算法快 o(n(logn)),因此中等大小規模表現良好,對規模非常大的資料排序不是最優選擇。但是比o( n^2)複雜度的演算法快得多。

shell排序演算法的時間複雜度分析比較複雜,實際所需的時間取決於各次排序時增量的個數和增量的取值。研究證明,若增量的取值比較合理,shell排序演算法的時間複雜度約為o(n(ldn)2)。

希爾排序(Shell Sort)

希爾排序 shell sort 又叫做縮小增量排序 diminishing increment sort 是一種很優秀的排序法,演算法本身不難理解,也很容易實現,而且它的速度很快。基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中...

希爾排序 shellsort

希爾排序 shellsort 又叫增量遞減 diminishing increment 排序,是由d.l.shell發明的,這個演算法是通過乙個逐漸減小的增量使乙個陣列逐漸趨近於有序從而達到排序的目的。假設有乙個陣列int data 16 首先將這個增量設為16 2 8,這樣就將這個陣列分成了8個子...

希爾排序(ShellSort)

希爾排序 shellsort cpp view plain copy include shellsort.h include print.h 希爾排序,分組進行插入排序,最後一步仍然是插入排序,但是因為之前的操作使逆序數減少,所以相對單純的插入排序效率高。void shellsort inta,in...