我是靠谱客的博主 仁爱毛豆,最近开发中收集的这篇文章主要介绍插入排序—希尔排序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

排序思路

希尔排序是一种分组插入排序。先取定一个小于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增大后,组内元素已经接近有序状态。满足第一条

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

最后

以上就是仁爱毛豆为你收集整理的插入排序—希尔排序的全部内容,希望文章能够帮你解决插入排序—希尔排序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部