希爾排序 C語言實現

2021-10-10 15:51:55 字數 2492 閱讀 1184

希爾排序( shell』s sort)又稱「縮小增量排序」( diminishing increment sort),是插入排序的一種, 因d.l.shell 於1959 年提出而得名。

直接插人排序,當待排序的記錄個數較少且待排序序列的關鍵字基本有序時,效率較高。希爾排序基於以上兩點,從「減少記錄個數」和「序列基本有序」兩個方面對直接插入排序進行了改進。

基本思想:

先將整個待排記錄序列分割成若干子串行,分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。

希爾排序演算法,特點:

1)縮小增量

2)多遍插入排序

演算法步驟:

希爾排序實質上是採用分組插人的方法。先將整個待排序記錄序列分割成幾組,從而減少參與直接插入排序的資料量,對每組分別進行直接插人排序,然後增加每組的資料量,重新分組。這樣當經過幾次分組排序後,整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插人排序。

希爾對記錄的分組,不是簡單地「逐段分割」,而是將相隔某個「增量」的記錄分成一組。

(1)第一趟取增量d

1d_1

d1​ (d

1d_1

d1​d

1d_1

d1​個組,所有間隔為d

1d_1

d1​的記錄分在同一組,在各個組中進行直接插人排序。

(2)第二趟取增量d

2d_2

d2​ (d

2d_2d2​

1d_1

d1​), 重複上述的分組和排序。

(3)依次類推,直到所取的增量d

td_t

dt​=1 (d

td_tdt​

t−1d_

dt−1​2

d_2d2​1

d_1d1

​), 所有記錄在同一組中進行直接插入排序為止。

時間複雜度

o(n1.3

n^n1

.3)空間複雜度

o(1)

穩定性

不穩定 (如圖中「上劃線49」和「49」的相對位置在排序前後變了,故不穩定)

完整**如下:

#include
#include

#include

#define maxsize 100

//順序表最大容量,可以自行加大

typedef

struct

elemtype;

//記錄型別

typedef

struct

sqlist;

//順序表

void

initlist

(sqlist &l)

//順序表的初始化

void

createlist

(sqlist &l)

//順序表的建立

scanf

("%d"

,&l.data[l.length]

.key)

;//順序表資料的輸入 if(

getchar()

=='\n'

)//迴圈終止條件

break;}

}void

inputlist

(sqlist l)

//順序表的輸出

printf

("列印為:");

for(i=

1;i<=l.length;i++

)//利用迴圈列印順序表中的資料

printf

("%d "

,l.data[i]

.key);}

void

shellinsert

(sqlist &l,

int dk)

//對順序表l做一趟增量是dk的希爾插入排序 ,當dk==1時為直接插入排序 }}

void

ssort

(sqlist &l,

int dt,

int t)

//按增量序列dt[0…t-1]對順序表l作t趟希爾排序

void

shellsort

(sqlist &l)

//對順序表做希爾排序

;//各趟排序的增量序列,可更改

ssort

(l,dt,t)

;//進入增量序列dt[0…t-1]對順序表l作t趟希爾排序

(完)

用C語言實現希爾排序

形象地說就是像軍訓或者體育課初次進行排隊的步驟 教官 老師讓所有人排成一隊,按1 2 3 1 2 3迴圈報數 此時下標的一定增量就是3 報到相同數字的就重新組成一隊 分組,但事實上不會分成三組,只是邏輯上進行分組,相當於打上標記 在每個重新組成的組裡按身高進行排序 直接插入排序 改變增下標增量d 一...

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

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

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

希爾排序也叫縮小增量排序,它其實是直接插入排序的一種改進版本,實質是一種分組插入方法 基本思想 演算法先將要排序的一組數按某個增量 d d減到1時,整個要排序的數被分成一組,排序完成。一般的初次取序列的一半為增量 以後每次減半,直到增量為1。基本步驟 以如下8個記錄為例,來看一下排序的過程 40,3...