一.什么是希尔排序
希尔排序是插入排序的一种改良算法,是一种不稳定的排序算法。不同于插入排序每次的步长为1,希尔排序的步长可以自己进行拟定,只要逐渐减小最后到1即可。
比如数组 A={2,4,7,2,4,8,9,0,1}
我们先定义步长为4,那么下标为0,4,8…的数字将会进行比较并排序
同理下标为1,5,9… 2,6,10… 3,7,11… 的数字都会分组进行排序
之后步长可以缩小为2,然后为1,排序则完成。
上图步长为23,10,4,1
注意:
图片源自:
https://commons.wikimedia.org/w/index.php?curid=16020133
下面有完整的C++代码
二.C++代码
#include<iostream>
using namespace std;
template<typename E>
/*
希尔排序:缩小增量排序
*/
//比较函数,小的数放在前面
bool compare(E a,E b)
{
return a<b;
}
//交换函数
template<typename E>
void swap(E A[],int a,int b)
{
int temp=A[a];
A[a]=A[b];
A[b]=temp;
}
//打印函数
template<typename E>
void print(E A[],int n)
{
for(int i=0;i<n;i++)
{
if(i==n-1) cout<<A[i]<<endl;
else cout<<A[i]<<" ";
}
}
template<typename E>
void inssort2(E A[],int n,int incr)
{
for(int i=incr;i<n;i+=incr)
for(int j=i;(j>=incr) && compare(A[j],A[j-incr]);j-=incr)
swap(A,j,j-incr);
}
//希尔排序函数
template<typename E>
void shellsort(E A[],int n)
{
for(int i=n/2;i>2;i/=2) //确定增量
for(int j=0;j<i;j++) //对切分开的数组进行排序
inssort2<E>(&A[j],n-j,i);
inssort2<E>(A,n,1); //最后进行一次增量为1的排序(插入排序)
}
int main()
{
int a[10]={2,4,3,6,9,0,1,6,4,5};
cout<<"begin:";
print(a,10);
shellsort(a,10);
cout<<"end:";
print(a,10);
system("pause");
return 0;
}