插入排序—希尔排序

排序思路

希尔排序是一种分组插入排序。先取定一个小于n的整数d1作为第一个增量,把表全部元素分成d1个组,所有相互之间距离为d1的倍数的元素放在一个组内。在各组之间进行插入排序;然后再取第二个增量d2(d2<d1)重复分组和排序的过程,直至所取的增量dt=1(dt<d(t-1)<……<d2<d1)。

举例:对于数组int a[10]={9,8,7,6,5,4,3,2,1,0};

d1=10/2=5

{9,4},{8,3},{7,2},{6,1},{5,0}

代码实现

取d1=n/2,d_{i+1}=\left \lfloor d_{i}/2 \right \rfloor

#include <iostream>

using namespace std;

void shellSort(int a[],int n)
{
    int gap,tmp,j,i;//gap代变每次取的增量
    gap=n/2;
    while(gap>0)//gap最小为1
    {
        //就是直接插入方法,只是这里gap作为间距
        for(i=gap; i<n; i++)
        {
            tmp=a[i];
            j=i-gap;
            while(j>=0&&tmp<a[j]){
                a[j+gap]=a[j];
                j=j-gap;
            }
            a[j+gap]=tmp;

        }
        gap=gap/2;
    }


}

int main()
{
    int a[]={9,8,7,6,5,4,3,2,1,0};
    shellSort(a,10);
    for(int i=0;i<10;i++){
        cout << a[i]<<",";

    }
    cout<< endl;
    return 0;
}

算法分析

目前希尔排序的增量选区没有定论,但是保证最后一个增量必须等于1。希尔排序算法的时间复杂度难以分析,一般认为其平均时间复杂度为O(n^{1.3})

希尔排序优于直接插入排序的原因:对于直接插入排序有两点可以提升性能

  • 如果直接插入排序的初态基本有序时,直接插入排序比较和移动的次数较少
  • 当n的值较小时,n和n^{2}差别也较小。

希尔排序通过分组,使开始排序每组内直接插入排序的n比较小,满足第二条;到后面增量减小,组内n增大后,组内元素已经接近有序状态。满足第一条

希尔排序是一种不稳定的排序算法。

猜你喜欢

转载自blog.csdn.net/SICAUliuy/article/details/88774698
今日推荐