排序算法之希尔排序

Posted CodeBeauty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之希尔排序相关的知识,希望对你有一定的参考价值。

基本思想

  希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

  希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1外没有公因子,且最后一个增量因子必须为1。

代码实现:

  

#include<iostream>
using namespace std;

void ShellInsertSort(int a[], int n, int dk)
{
    for (int i = dk; i<n; ++i) 
    {
        if (a[i] < a[i - dk]) 
        {          //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入  
            int j = i - dk;
            int x = a[i];          //复制为哨兵,即存储待排序元素  
            a[i] = a[i - dk];      //首先后移一个元素  
            while (x < a[j]) {     //查找在有序表的插入位置  
                a[j + dk] = a[j];
                j -= dk;            //元素后移  
            }
            a[j + dk] = x;           //插入到正确位置  
        }
    }
}


//先按增量d(n/2,n为要排序数的个数进行希尔排序
void shellSort(int a[], int n) {

    int dk = n / 2;
    while (dk >= 1) 
    {
        ShellInsertSort(a, n, dk);
        dk = dk / 2;
    }
}

int main() {
    int a[8] = { 3,1,5,7,2,4,9,6 };
    shellSort(a, 8);           //希尔插入排序  
    for (auto c : a)
    {
        cout << c << " ";
    }
    cout << endl;
}

 

以上是关于排序算法之希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

图解排序算法之希尔排序

图解排序算法之希尔排序

图解排序算法之希尔排序

排序算法入门之希尔排序(java实现)

重温基础算法内部排序之希尔排序法

算法之希尔排序快速排序二分查找