高階排序之希爾排序

2021-06-28 13:33:39 字數 1837 閱讀 6675

希爾排序原理

希爾排序:是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次。希爾排序就是首先對大跨度的元素做比較並且進行移動,這樣的久相對有序了,再在這個基礎上進行普通的插入排序,效率就會...

高階排序演算法 希爾排序

希爾排序 希爾排序是插入排序的優化版。回憶一下插入排序,假如插入排序執行到一半的時候,這時陣列左邊是已經排好序的,而右邊是還沒有排序的。如果有乙個很小的資料項恰好在右邊的位置,這時所有左邊已排好序的陣列都得往右移,騰出空位讓這個小的資料項插入。希爾排序是在插入演算法的基礎上再次降低交換的次數,以此獲...