希尔排序(又称 缩小增量排序)插入排序中的一种
1.算法基本思想:
将待排序列分成若干子序列(不是逐段分割成子序列,将相隔某个增量的记录组成子序列),分类别进行直接插入排序,
待整个序列基本有序时候,再对整个序列进行一次直接插入排序dk=1。
2. 增量dk序列(每个dk是质数,且最后一个dk一定是1)(eg.[5,3,1])3. 时间复杂度O(n1.5)——最好情况下,空间复杂度O(1),不稳定!!!
4. 最外层循环i++:划分子序列(i+1递增,内层循环j=+dk,)
#include <iostream>
#include <cstdlib>
using namespace std;
void ShellInsert(int *l,int n,int dk){
//希尔排序
//确定dk的一次希尔排序即希尔插入
int i,j;
for(i=dk+1;i<n;i++){
if(l[i]<l[i-dk]){
l[0]=l[i];
for(j=i-dk;j>0&&l[j]>l[0];j=-dk){
l[j+dk]=l[j];
}
l[j+dk]=l[0];
}
}
}
void ShellSort(int *l,int n,int *dkp,int m){
for(int i=0;i<m;i++){
ShellInsert(l,n,dkp[i]);
}
}
int main()
{
int l[100],n=0;
l[0]=0;
int dkp=[5,3,1];
cout<<"输入数据的大小:"<<endl;
cin>>n;
cout<<"输入需要排序的数据:"<<endl;
for(int i=1;i<=n;i++){
cin>>l[i];
}
ShellSort(l,n,dkp,3);
cout<<"排序后数据:"<<endl;
for(int i=1;i<=n;i++){
cout<<l[i]<<endl;
}
return 0;
system("pause");
}