希爾排序也叫縮小增量排序,它其實是直接插入排序的一種改進版本,實質是一種分組插入方法
基本思想:
演算法先將要排序的一組數按某個增量
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...