接着上次写的插入排序,因为希尔排序其实是在插入排序的基础上扩展出来的,就是分组进行插入排序。关键就是多了一个增量而已。网上已经有它的详细介绍。时间复杂度比插入排序,冒泡排序都要好。这里给出它的详细实现及关键的注释。
/********************************************************
*函数名称:ShellSort
*参数说明:a 无序数组;
* num 数组元素个数
*说明: 希尔排序
*********************************************************/
void ShellSort(int *a,int num)
{
int i,j,gap;//定义循环变量和增量
for(gap=num/2;gap>0;gap /= 2)//初始增量设为数组长度的一半,每次增量变为上次的二分之一
{
for(i=gap;i<num;i+=gap)//从第2个数据开始插入
{
int temp=a[i];//取得将要插入的元素
for(j=i-gap;j>=0&&a[j]>temp;j-=gap)//直到在已经有序部分找到比插入元素小的位置才退出
{
a[j+gap]=a[j];//移动
}
a[j+gap]=temp;
}
}
}