shell排序是插入排序的一種,在時間效率上有較大的改進。是一種不穩定的排序方法。
基本思想:選定第一個增量d1 < n,把全部記錄按此值從第一個記錄起進行分組,所有相距爲d1的記錄作爲一組,先在各組內進行插入排序,然後減小間隙,取第二個增量d2 < d1,重複上述分組和排序過程,直到增量d爲1爲止,即所有的距離放在同一組內排序。
算法的思路:
shell排序算法通過三重循環實現;
1.外循環以各種不同的間隔距離d進行循環,直到d=1爲止。
2.第二重循環是在某一個d值下對所分的組進行組循環
3.第三重循環是對第二重循環中所分的每個組,進行組內循環。
算法實現:
#include<stdio.h>
#define Type int //可以換爲char
void shell_insert(Type *buf, int n)
{
Type x;
int i,j,d;
d = n / 2; //定義增量
while(d >= 1) //第一趟循環,以不同的d進行循環
{
for(i = d; i < n; i++) //第二趟循環,循環不同的組,應用直接插入排序
{
x = buf[i];
j = i - d;
while((j > 0)&&(x < buf[j])) //第三趟循環,組內排序,
{
buf[j + d] = buf[j];
j = j -d;
}
buf[j+d] = x;
}
d = d / 2; //再次劃分增量d
}
}
int main()
{
int i;
Type num[11] = {1,11,23,32,24,3,5,8,10,16,22}; //"asdfghjkloq"
printf("Original array:");
for(i = 0; i < 11; i++)
printf("%d ", num[i]); //注意輸出格式的替換
printf("\n");
shell_insert(num, 11);
printf("Sorted array:");
for(i = 0; i < 11; i++)
printf("%d ", num[i]); //注意輸出格式的替換
printf("\n");
return 0;
}