希爾排序原理
希爾排序:是d.l.shell與2023年提出的一種排序演算法,在這之前的排序演算法的時間複雜度基本都是o(n^2),希爾演算法是第乙個打破這個時間複雜度的演算法。
希爾排序是直接插入排序的公升級演算法,
其核心思想是讓乙個序列分成若干個子串行,分隔方法是將相隔某個增量的記錄組成自序列,在子串行見進行直接插入排序,當整個序列基本有序是,再進行一次完整的直接插入排序。
基本有序:以序列為例講解
分三組,,,,分別排序這樣的序列不屬於基本有序
所謂基本有序是大的基本在後面,小的基本在前面如這個就屬於基本有序
希爾排序**
void shellsort( arr *l )
l->data[j]=sentry;}}
}while(increment>1);
} 過程講解:
以排序為例
增量為初始值為記錄數,變化increment=increment/3+1;
9158 37462
increment=9/3+1=4
第一次while迴圈:
i=increment=4,
j=i=4 9
15 8
374 62
j-increment=4-4>=0, 3<9,將9後移increment個單位,9的位置補3 ()
1 5
8 9
7 462
data[j=0]=sentry=3 3
1589
7462
i=5, j=i=5 3
1589
7462
j-increment=1>=0 ,7>1,不變 3
1589
7462
data[j=5]=sentry=7
i=6,j=6 3
1589
7462
j-increment=2>0,
4<5,將data[3]與data[7]交換
data[j=6]=data[6-4=2]=5; 3
1589
7562
j-increment=-2<0,
data[j=2]=sentry=4 3
1489
7562
i=7,j=7 3
1489
7562
j=7,j-increment=3>0, sentry=6
data[j=7]=data[j-increment=3] 3
1489
7582
j=3,j-increment=-1<0,
data[j]=sentry; 3
1469
7582
i=8,j=8 3
1469
7582
j-increment=4>0sentry=2 3
1469
7589
j=4,j-increment=0>=0 sentry=2 3
1463
7589
j=0,j-increment<0
data[j]=sentry=2; 2
1463
7589
第二次while迴圈,increment=4/3+1=2;
同上操作
第三次while迴圈,increment=2/3+1=1
此次迴圈為一次完整的插入排序
複雜度分析:
希爾排序並不是分組後針對每個小組的排序,而是在某個「增量」組成的子串行的跳躍式排序。
增量序列的最後乙個增量必須為1,,確保完成一次插入排序。
時間複雜度由o(n^2)提公升到了o(n^3/2)
希爾排序不是乙個穩定的排序。
高階排序之希爾排序
希爾排序 shell s sort 是插入排序的一種又稱 縮小增量排序 diminishing increment sort 是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因d.l.shell於1959年提出而得名。這裡需要注意的是如果希爾增量按照減半的方式去遞減的話...
高階排序 希爾排序
希爾排序 實際上是基於插入排序的,在插入排序中相比較的是相鄰的兩個元素,但是如果乙個很小的數在陣列的最右端,而他本應該是在最左端的,這樣的話所有中間的元素都要向右移動一位,並且執行了n次。希爾排序就是首先對大跨度的元素做比較並且進行移動,這樣的久相對有序了,再在這個基礎上進行普通的插入排序,效率就會...
高階排序演算法 希爾排序
希爾排序 希爾排序是插入排序的優化版。回憶一下插入排序,假如插入排序執行到一半的時候,這時陣列左邊是已經排好序的,而右邊是還沒有排序的。如果有乙個很小的資料項恰好在右邊的位置,這時所有左邊已排好序的陣列都得往右移,騰出空位讓這個小的資料項插入。希爾排序是在插入演算法的基礎上再次降低交換的次數,以此獲...