0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文看懂直接插入排序和希尔排序

学益得智能硬件 来源:学益得智能硬件 2023-03-06 11:35 次阅读

要说排序算法里面比较简单的,我觉得直接插入排序算是一个。

直接插入排序的原理很简单,就是把一个数字插入到一个有序的数组中。

比如有这么一个数组:

1,3,5,7
然后要把 4 插进去。

过程不难,4跟 7 比,7大,把 7 往后移动;

4跟 5 比,5大,把 5 往后移动;

4跟 3 比,3小,于是直接把4放到第三个位置上。

但是问题又来了,去哪找一个有序的数组,排序本来就是没有顺序的。

于是就有了一个理论,如果一个数组中只有一个元素,那么它一定是有序的。

比如有这么一个数组:
6 4 5 3 7
先把 6 当作一个单独的数组,那么它一定是有序的。

把 4 插入到这个有序的数组中,先把 4 记下来,4跟 6 比,6向后移动,然后把 4 放到第一个位置。
4 6 5 3 7
接下来再把 5 插入到4 6这个有序的数组中,过程一样。
4 5 6 3 7
循环下去,最终一定会得到一个有序的数组。

代码也不难。
#include 
#include 
#include 


#define SIZE     100000


void insert_sort(int *a, int size)
{
    int i, j, num;
    for (i = 1; i < size; i++)
    {   
        num = a[i];
        for (j = i - 1; j >= 0; j--)
        {   
            if (num < a[j])
            {   
                a[j + 1] = a[j];
            }
            else
            {
                break;
            }
        }
        a[j + 1] = num;
    }
}


int main()
{
    int num, arr[SIZE] = {0}, i;


    //随机产生数组
    srand(time(NULL));
    for (i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 100;
    }


    insert_sort(arr, SIZE);


    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");


    return 0;
}

直接插入排序的效率很低,基本上跟冒泡是一个级别。 问题就出在移动的次数太多。
6 4 5 3 7
比如 3 这个元素,最终应该放在 6 这个位置上,但是这个过程需要跟每个数字比较并且向后移动。

于是有个叫做希尔的人就提出了改进思路,如果能让 3 跳着来,速度就会提高很多。

后来就有了希尔排序。

第一步,先选取 2 作为步长,就是长度的一半,把原数组分成了两个数组,一个是6 5 7,一个是4 3,对这两个数组分别做直接插入排序。
6  5  7
 4  3
你会发现,这一次 3 直接和 4 交换了位置,一下子跳了两步。

第二步,步长再缩减一半,就是1。

其实就是对整个数组做直接插入排序。

有些同学可能会有疑问,既然最终也是对整个数组做直接插入排序,为什么不一开始就这样?

随着步长的逐渐的缩减,数组会变得基本有序,虽然最后一步也是直接插入排序,但是移动的元素会很少。

希尔排序的效率要比直接插入排序高很多。

代码也只需要做简单的修改。
#include 
#include 
#include 


#define SIZE     100000


void shell_sort(int *a, int size)
{
    int i, j, num, h;
    for (h = size / 2; h > 0; h /= 2)
    {   
        for (i = h; i < size; i++)
        {   
            num = a[i];
            for (j = i - h; j >= 0; j = j - h)
            {   
                if (num < a[j])
                {
                    a[j + h] = a[j];
                }
                else
                {
                    break;
                }
            }
            a[j + h] = num;
        }
    }
}


int main()
{
    int num, arr[SIZE] = {0}, i;


    //随机产生数组
    srand(time(NULL));
    for (i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 100;
    }


    shell_sort(arr, SIZE);


    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");


    return 0;
}
最后来试下 5 万个数据排序,两者的差距肉眼可见。
root@Turbo:test# time ./insert_sort 


real  0m1.740s
user  0m1.724s
sys  0m0.000s
root@Turbo:test# time ./shell_sort 


real  0m0.008s
user  0m0.004s
sys  0m0.004s
root@Turbo:test#




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • printf函数
    +关注

    关注

    0

    文章

    31

    浏览量

    5878
  • Printf
    +关注

    关注

    0

    文章

    81

    浏览量

    13604

原文标题:2分钟看懂直接插入排序和希尔排序

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA排序-冒泡排序介绍

    排序算法是图像处理中经常使用种算法,常见的排序算法有插入排序希尔排序、选择
    发表于 07-17 10:12 1047次阅读
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介绍

    手把手教你排序算法怎么写

    今天以直接插入排序算法,给大家分享一下排序算法的实现思路,主要包含以下部分内容:插入排序介绍插入排序算法实现手把手教你排序算法怎么写在添加新
    的头像 发表于 06-04 08:03 624次阅读
    手把手教你<b class='flag-5'>排序</b>算法怎么写

    十种常用排序法详解总结和比较选择

    ,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。  若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序
    发表于 10-26 15:11

    C语言教程之直接插入排序

    C语言教程之直接插入排序,很好的C语言资料,快来学习吧。
    发表于 04-22 11:06 0次下载

    C语言教程之几种排序算法

    数据结构的排序算法有很多种。 其中, 快速排序希尔排序、堆排序直接选择
    发表于 11-16 10:23 1741次阅读

    基于C语言二分查找排序源代码

    本文档内容介绍了C语言归并、选择、直接插入希尔、冒泡、快速、堆排序与顺序、二分查找排序源代码,分享给大家供大家参考。
    发表于 01-04 11:24 1次下载

    常用排序算法分析

    种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序插入排序,归并
    的头像 发表于 07-13 16:13 2127次阅读

    几种c语言程序的排序包括应用程序等资料免费下载

    本文档的主要内容详细介绍的是几种c语言程序的排序包括应用程序好资料免费下载包括了:堆排序,改进冒泡排序,归并排序,简单插入排序,简单选择
    发表于 09-29 08:00 6次下载
    几种c语言程序的<b class='flag-5'>排序</b>包括应用程序等资料免费下载

    插入排序和冒泡排序哪个更牛逼?

    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。
    的头像 发表于 11-27 16:13 8175次阅读

    揭秘冒泡排序、交换排序插入排序

    01 — 冒泡排序 在实现冒泡排序代码之前我们先理解下什么是冒泡排序,我们举个现实生活中的例子来帮助我们理解。 操场排队我们都知道吧,现
    的头像 发表于 06-18 09:57 1517次阅读

    浅谈希尔排序算法思想以及如何实现

    01 希尔排序算法思想 希尔排序也是插入排序,是简单插入
    的头像 发表于 06-30 10:05 1991次阅读

    解析数据结构的常用七大排序算法

    为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入排序希尔排序、冒泡排序、快速
    的头像 发表于 03-16 08:22 1631次阅读

    希尔排序的基本思想

    希尔排序插入排序种,又称“缩小增量排序”,希尔排序
    发表于 08-08 10:02 1338次阅读

    光纤直接插入芯片,速度和效率惊人!

    TeraPHY是款光学I/O小芯片,拥有4Tbps的双向带宽,却只有10W的功耗。这项技术的重要性在于,摆脱了传统的PCB和长电气走线的限制,通过直接插入芯片,实现了更高效的数据传输。
    的头像 发表于 12-21 14:45 790次阅读

    用FPGA实现双调排序的方法(2)

    典型的排序算法包括冒泡排序、选择排序插入排序、归并排序、快速排序
    的头像 发表于 03-21 10:28 595次阅读
    用FPGA实现双调<b class='flag-5'>排序</b>的方法(2)