#include<iostream>
using namespace std;
template<typename Ritr>
void shell_sort(Ritr first,Ritr last)
{
int const n=last-first;
int gap=1;
for(;(gap*=3)<n;++gap);
for(gap/=3;0<gap;gap=(gap-1)/3)
for(int i=gap;i<n;++i)
for(int j=i-gap;j>=0;j-=gap)
if(first[j+gap]<first[j])
std::swap(first[j],first[j+gap]);
else
break;
}
int main()
{
int a[9]={9,1,0,2,3,6,8,4,5};
shell_sort<int*>(a+0,a+9);
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
return 0;
}
下面的函数模板为H(i+1)=3*H(i)+1增量序列的Shell排序代码:
Shell代码适合中小型代码的排序,例如n<=10000,而在实际问题中出现的数据可能不太随机。如果有一部分已经排序,则这时最适合用Shell代码。
Shell代码是不稳定的,还没有好的方法使其稳定。
运行结果: