希尔排序是插入排序的一种,它的基本思想是将相隔某个“增量d”的记录组成一个子序列,然后对每个子序列进行插入排序,实现跳跃式的移动,使得排序的效率提高。
以数组 [10 15 9 14 18 17 7 13]为例
第一个增量设为4
第一趟排序结束后为:10 15 7 13 18 17 9 14
第二趟我们取增量为2
第二趟排序结束后:7 13 9 14 10 15 18 17
第三趟取增量为1
7 13 9 14 10 15 18 17
第三趟排序后:7 9 10 13 14 15 17 18
下面是用C++实现的代码:
#include<iostream>
using namespace std;
//交换数组中两个元素位置
void swap(int *p,int *q)
{
int tmp=0;
tmp=*p;
*p=*q;
*q=tmp;
}
//对每个增量d进行直接插入排序
void insert(int *p,int n,int d)
{
for(int i=d;i<n;i++)
{
int k=*(p+i);
int j=i-d;
while(j>=0 && *(p+j)>k)
{
swap(p+j+d,p+j);
j=j-d;
}
}
}
//希尔排序
void sort(int *p,int n)
{
int d=n/2;
while(d>=1)
{
insert(p,n,d);
d=d/2;
}
}
//输出数组
void print(int *p,int n)
{
for(int i=0;i<n;i++)
{
cout<<*p<<endl;
p++;
}
}
void main()
{
int num[15]={26,17,23,15,19,37,25,20,18,31,27,9,12,29,30};
int *p=num;
sort(p,15);
print(p,15);
}
这里的增量d我们选取的是数组长度的1/2,每一趟都减半直到d==1
运行结果: