#include<bits/stdc++.h>
using namespace std;
void ShellSort(int A[], int N)
{
int Sedgewick[]= {929, 505, 209, 109, 41, 19, 5, 1, 0};
int si;
for (si = 0; Sedgewick[si] >= N; ++si);
for (int d = Sedgewick[si]; d > 0; d = Sedgewick[++si])//利用0元素退出
{
for ( int i = d; i < N ; ++i )//待插入元素下标
{
int tem = A[i]; //防止在下面循环中A[i]被覆盖
int j;
for ( j = i; j >= d && A[j-d] > tem; j -= d )
{ //分组插入
A[j] = A[j-d];//满足要求则将A[j-d]向后移位
}
A[j] = tem;//1、若j < d导致退出,则A[0] = tem;满足要求
//2、若A[j-d] <= tem导致退出,
// 因为当前元素已被存放至A[j+d]
// 则tem覆盖当前元素即可
}
}
}
int main()
{
int a[] = {4,5,9,1,3,5,3,6,8,33,21,45};
int N = sizeof(a)/sizeof(a[0]);
ShellSort(a, N);
cout<<"ShellSort: ";
for (int i = 0; i < N; ++i)
{
cout <<a[i]<<' ';
}
return 0;
}
运行结果:
软件环境:DevC++
如有任何错误,请指出