希爾排序( shell』s sort)又稱「縮小增量排序」( diminishing increment sort),是插入排序的一種, 因d.l.shell 於1959 年提出而得名。
直接插人排序,當待排序的記錄個數較少且待排序序列的關鍵字基本有序時,效率較高。希爾排序基於以上兩點,從「減少記錄個數」和「序列基本有序」兩個方面對直接插入排序進行了改進。
基本思想:
先將整個待排記錄序列分割成若干子串行,分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。
希爾排序演算法,特點:
1)縮小增量
2)多遍插入排序
演算法步驟:
希爾排序實質上是採用分組插人的方法。先將整個待排序記錄序列分割成幾組,從而減少參與直接插入排序的資料量,對每組分別進行直接插人排序,然後增加每組的資料量,重新分組。這樣當經過幾次分組排序後,整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插人排序。
希爾對記錄的分組,不是簡單地「逐段分割」,而是將相隔某個「增量」的記錄分成一組。
(1)第一趟取增量d
1d_1
d1 (d
1d_1
d1d
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−12
d_2d21
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...