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

希尔排序

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


以下为转载内容
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1)插入排序在对几乎已经排好序的数据操作时,效率高, 即可以达到线性排序的效率。
2)插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

我们将数组中两个元素之间的距离称为Gap,相邻元素之间的Gap自然是1,很明显的,插入排序的算法在调节元素的时候,Gap是1,这就造成了上面讲的低效的原因2)。因此希尔排序的思想如下:
1. 假设序列的元素个数是n,选取一个初始Gap的d(d2. 将序列中元素之间距离(即Gap)为d的元素分为一组,在每组之间直接进行插入排序
3. 全部完成以后,缩小Gap至d1(d12直到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] <"pause");
    return EXIT_SUCCESS;
}

运行结果:
几个基础算法介绍和实现——希尔排序_第1张图片


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

你可能感兴趣的:(数据结构,算法)