设待排序对象序列有 n 个对象, 首先取一个整数 gap < n 作为间隔, 将全部对象分为 gap 个子序列, 所有距离为 gap 的对象放在同一个子序列中, 在每一个子序列中分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划分和排序工作。直到最后取 gap == 1, 将所有对象放在同一个序列中排序为止。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
#define MAXSIZE 200
typedef struct {
int r[MAXSIZE+1];
int length;
} SqList;
void ShellSort ( int V[ ], int n ) {
int temp,i,j;
int gap = n / 2; //gap是间隔
while ( gap != 0 ) { //循环,直到gap为零
for ( i = gap; i < n; i++) {
temp = V[i]; //直接插入排序
for ( j = i; j >= gap; j = j-gap )
if ( temp < V[j-gap] )
V[j] = V[j-gap];
else break;
V[j] = temp;
}
gap = ( int ) ( gap / 2 );
}
}
int main() {
srand(time(0));
SqList L;
L.length=10;
for(int i=0; i<10; i++) {
L.r[i]=rand()%100;
}
for(int i=0; i<10; i++) {
cout<<L.r[i]<<" ";
}
puts("");
ShellSort (L.r,L.length);
for(int i=0 ;i<10; i++) {
cout<<L.r[i]<<" ";
}
puts("") ;
return 0;
}