几个基础算法介绍和实现——希尔排序

来源:互联网 发布:网游加速器 知乎 编辑:程序博客网 时间:2024/06/04 20:11

希尔排序

希尔排序通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序位置,所以希尔排序也叫做缩小增量排序


以下为转载内容希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作时,效率高, 即可以达到线性排序的效率。2)插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。我们将数组中两个元素之间的距离称为Gap,相邻元素之间的Gap自然是1,很明显的,插入排序的算法在调节元素的时候,Gap是1,这就造成了上面讲的低效的原因2)。因此希尔排序的思想如下:1. 假设序列的元素个数是n,选取一个初始Gap的d(d<n)2. 将序列中元素之间距离(即Gap)为d的元素分为一组,在每组之间直接进行插入排序3. 全部完成以后,缩小Gap至d1(d1<d),然后继续2直到Gap为1常见的Gap序列如下:1)希尔原本的Gap:N/2、N/4、...1(反复除以2)2)Hibbard的Gap:137...、2k-1(k表示第几个gap)3)Knuth的Gap: 1413...、(3k - 1) / 2(k表示第几个gap)4)Sedgewick的Gap: 151941109...
代码如下:void Sort::shellSort(int(&a)[11], int n){    int i, j, increment;    int temp;    for (increment = n / 2; increment  >= 1; increment /= 2)    {        for (i = increment; i < n; i++)        {            temp = a[i];            for (j = i; j >= increment; j -= increment)            {                if (temp < a[j - increment])                    a[j] = a[j - increment];                else                    break;            }            a[j] = temp;        }           }}int main(void){    Sort m_sort;    int a[11] = { 34, 8, 64, 51, 32, 21, 99, 108, 54, 33, 77 };    m_sort.shellSort(a, 11);    for (int i = 0; i < 11; i++)    {        cout << a[i] <<endl;    }    system("pause");    return EXIT_SUCCESS;}

运行结果:
这里写图片描述


总结:
1. 希尔排序的平均时间复杂度是O(n2)
2. 希尔排序为非稳定排序