一个较难的排序,但是由于代码比较简洁,理解起来也相对容易
若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。我们的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)
题目要求我们用增量n/2和1来排序,定义一个函数即可
核心代码之后11-16行,理解即可
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n;
void shellsort(int *a,int d){
for(int i=d; i<n; i++){
int t = a[i];
int j;
for(j=i; j>=d&&a[j-d]>t; j-=d)
a[j] = a[j-d];
a[j] = t;
}
for(int i=0; i<n; i++){
if(i==n-1)
cout<<a[i]<<endl;
else
cout<<a[i]<<" ";
}
}
int main()
{
int a[10010];
while(cin>>n){
for(int i=0; i<n; i++){
cin>>a[i];
}
shellsort(a,n/2);
shellsort(a,1);
}
return 0;
}