希尔排序是直接插入排序的改进版。首先设置步长len,然后分组,下标之差为步长整数倍的分为一组。然后去len/2作为步长,直至len=1,此时就是直接
插入排序了。
代码如下:
#include<iostream>
using namespace std;
void shell_sort(int a[],int n)
{
int i,j,len,tem; //len为步长
len=n/2; //默认步长设为n/2
while(len>=1)
{
for(i=len;i<n;i++) //当len=1时就是插入排序了
{
tem=a[i];
j=i-len;
while(j>=len-1 && a[j]>tem)
{
a[j+len]=a[j];
j-=len;
}
a[j+len]=tem;
}
len/=2;
}
}
int main()
{
int a[100];
int i,n;
while(cin>>n,n)
{
for(i=0;i<n;i++)
cin>>a[i];
shell_sort(a,n);
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl<<endl;
}
return 0;
}
Attention:
①希尔排序是原地排序。
②时间复杂度为o(nlog2n),空间复杂度为o(n)。