http://blog...sina...com...cn/s/blog_6d88423901014vai.html 原理
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;
/*希尔排序的基本思想是:。。。步长系数有优劣
该方法的基本思想是:先将整个待排元素序列分
割成若干个子序列(由相隔某个“增量”的元素组成的)
分别进行直接插入排序,然后依次缩减增量再进行排序,
待整个序列中的元素基本有序(增量足够小)时,
再对全体元素进行一次直接插入排序。
因为直接插入排序在元素基本有序的情况下(接近最好情况),
效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。。*/
void HillSort(int a[],int n)
{
int i, j,gap;
for(int gap=n/2;gap>=1;gap=gap/2)
{
for(i=0;i<gap;i++)
{
for(j=gap;j<n;j+=gap)
if(a[j-gap]>a[j])
{
//插入排序
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
}
}
int main()
{
int i,ISource[20];
srand((unsigned)time(NULL));
for(i=0;i<20;i++)
ISource[i]=rand()%100;//产生随机数
for(i=0;i<20;i++)
cout<<ISource[i]<<" ";
cout<<endl;
double t1=clock();
HillSort(ISource,20);
double t2=clock();
for(i=0;i<20;i++)
cout<<ISource[i]<<" ";
cout<<endl;
}
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1、插入排序在对几乎已经排好序的数据操作时,效率高, 即可以达到线性排序的效率
2、对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。
希尔排序简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。(先将整个大数组基本有序,再对大数组来一次插入排序)
思想:使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。
我们只需要在插入排序的代码中将移动元素的距离改为h即可。这样,希尔排序的实现就转化为了一个类似于插入排序但使用不同增量的过程。