希尔排序,由发明者名字命名;
实质为分组插入排序;又称缩小增量排序
原理:对目标序列,按一定间隔(增量)取出所有可能的子序列,进行插入排序;
不断减小增量(每次减半),重复插入排序过程
示例代码:
#include
#include
using namespace std;
template
T * shell_sort1(T a[],int const n)
{
int i,j,s,gap;
T c;
for(gap=n/2;gap>0;gap=gap/2)//增量减少
{
for(i=0;i=gap&&c
以上严格按照原理执行,但显得太过复杂
可进一步优化为:
#include
#include
using namespace std;
template
T * shell_sort2(T a[],int const n)
{
int i,j,s,gap;
T c;
for(gap=n/2;gap>0;gap=gap/2)//增量减少
{
for(j=gap;j=gap&&c
看看优化在什么地方“?
其实是将中间两个for循环合并
结果:

相比:(引用其他人的)
直接插入排序是稳定的;而希尔排序是不稳定的。
直接插入排序更适合于原始记录基本有序的集合。
希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。
在希尔排序中,增量序列gap的取法必须满足:最后一个步长必须是 1 。
直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。