排序演算法之希爾排序(C語言實現)

2021-07-04 20:15:50 字數 1156 閱讀 2898

希爾排序也叫縮小增量排序,它其實是直接插入排序的一種改進版本,實質是一種分組插入方法

基本思想:

演算法先將要排序的一組數按某個增量

d(d減到1時,整個要排序的數被分成一組,排序完成。

一般的初次取序列的一半為增量

,以後每次減半,直到增量為1。

基本步驟:

以如下8個記錄為例,來看一下排序的過程:

40,32,28,45,28,55,12,24

增量序列依次為:4,2,1

可以看到關鍵字為28的順序發生了改變,即希爾排序是不穩定的,會改變相同元素的相對順序。如果a=b但是不在同乙個d間隔上,就會出現前後顛倒的情況

實現**:與直接插入排序類似(直接插入排序的增量為1)

#include#includevoid shellsort(int a,int len)

} }int main()

{ /*第一行輸入n,表示要排序的元素個數

第二行輸入n個元素的值

*/ int n;

while(scanf("%d",&n) != eof)

{ int *a = (int *)malloc(n*sizeof(int));

int i;

for(i=0;i

時間複雜度:

希爾排序的時間複雜度

與增量序列的選取有關 1.

最好情況當輸入序列已經有序的時候,每一次增量向前比較都立即不滿足條件而退出,故只有前面兩層迴圈起到了作用,複雜度為o(nlogn)

2.最壞情況

兩個增量序列:

n/2、n/4、n/8...1

1、3、7...2^k-1

第乙個序列稱為希爾增量序列,使用希爾增量時,希爾排序在最壞情況下的時間複雜度為o(n*n)。

第二個序列稱為hibbard增量序列,使用hibbard增量時,希爾排序在最壞情況下的時間複雜度為o(n^3/2)。 

排序演算法的C語言實現 希爾排序

希爾排序和氣泡排序有點相似,但是不同的是希爾排序使用乙個序列h1,h2.hi,叫做增量序列。在使用增量hk排序後,所有相隔hk的元素都被排序。希爾排序衝破二次時間屏障的第一批演算法之一。它有乙個重要性質 hk 排序的檔案 此後將是 hk 1 排序 將保持它的 hk排序性,這樣各趟排序結果就不會打亂前...

希爾排序 C語言實現

希爾排序 shell s sort 又稱 縮小增量排序 diminishing increment sort 是插入排序的一種,因d.l.shell 於1959 年提出而得名。直接插人排序,當待排序的記錄個數較少且待排序序列的關鍵字基本有序時,效率較高。希爾排序基於以上兩點,從 減少記錄個數 和 序...

C語言實現插入排序 希爾排序演算法

希爾排序演算法 void shellsort int arr,int len 插入排序 希爾排序 不穩定,空間複雜度為o 1 最壞時間複雜度為o n 2 include include 希爾排序演算法 void shellsort int arr,int len int main int len s...