#include<stdio.h>
void shellSort(int data[],int len);
int main(void)
{
int data[] = {45,20,80,40,26,58,66,70};
shellSort(data,8);
system("PAUSE");
}
void shellSort(int data[],int len)
{
int d = len;
int i,j;
while(d > 1)
{
d = (d+1)/2;
//關鍵代碼
for(i = 0;i < len-d;i++)
{
if(data[i+d] < data[i])
{
int temp;
temp = data[i+d];
data[i+d] = data[i];
data[i] = temp;
}
printf("\nd=%d|||||",d);
for(j = 0;j < 8;j++ )
{
printf("%d,",data[j]);
}
}
}
printf("\nresults:");
for(j = 0;j < 8;j++ )
{
printf("%d,",data[j]);
}
}
希爾排序(C語言實現)
希爾排序(Shell Sort)又稱縮小增量排序,因DL.Shell於1959年提出而得名。
假設有這樣一個數組{5,8,9,2,6,3,5,1},要求按照從小到大排列,如果使用直接插入排序,要將數組最後的1移到最前面,對於一個小數組來說也許無關緊要,但是當數據多到一定程度時,這種方式顯然是很耗費時間的。
由此引入希爾排序,基本思想是引入一個常量d來縮小增量。這裏0<d<n,n是待排序數組的長度。使用這個改進的希爾排序可以實現數據元素大跨度的移動,拿上述數組來說,1可以直接移到第一位,而不用從最後一位依次向前,這就是這個算法的優勢所在。
下面就一個例子進行說明
待排序數組:{45,20,80,40,26,58,66,70}
d=5時分組:{45,58}{20,66}{80,70}
排完後爲:{ 45,20,70,40,26,58,66,80}
d=3時分組:{45,40,66}{20,26,80}{70,58}{40,66}{26,80}
排完後爲:{40,20,58,45,26,70,66,80}
下面是C語言實現(DEV c++4.9.9.2運行通過)
希爾排序的執行時間是依賴與增量的選擇的,最後一個增量必須爲1(此時和插入排序基本一致),另外,希爾排序是不穩定的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.