【数据结构】八大排序之直接插入排序算法

举报
修修修也 发表于 2024/09/30 16:34:57 2024/09/30
【摘要】 🦄个人主页:修修修也 🎏所属专栏:数据 结 构 ⚙️操作环境:Visual Studio 2022​编辑目录📌 直接插入排序 简 介及思路 📌 直接插入排序的代 码实现 📌 直接插入排序的 时间 复 杂 度分析 🎏 最好情况 时间 复 杂 度 🎏 最坏情况 时间 复 杂 度 📌 直接插入排序的 优 化 结语 📌直接插入排序简介及思路直接插入排序(Straight Inser...

🦄个人主:修修修也

🎏所属专栏:数据

⚙️操作:Visual Studio 2022

​编辑


📌 直接插入排序 介及思路

📌 直接插入排序的代 码实现

📌 直接插入排序的 时间 度分析

🎏 最好情况 时间

🎏 最坏情况 时间

📌 直接插入排序的

结语


📌直接插入排序介及思路

直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法.

它的基本操作是:

将一个数据插入到已排好的有序表中,从而得到一个新的,数据数增1的有序表.

直到所有的数据插入完,得到一个新的有序序列.

在实际生活中,我们玩扑克牌时就使用了插入排序的思想:

​编辑

算法动图演示如下:编辑


📌直接插入排序的代码实现

算法实现:(以升序)

1. 当表中只有第一个数据的时候它是一定有序的,因此我们从第二个元素开始向前面的有序表"插入"数据.

2. 具体插入方式,使用tmp记录当前待插入元素,然后tmp从后向前与有序表中的元素逐一比,如果tmp小于比元素,则元素向后挪一个位置.

3. 直到tmp不小于比元素时,tmp插入到比元素后面.

4. 将数据向前插入,直到将待排数所有数据元素都插入有序表,排序完成.

清楚了逻辑和概念后,我们的代码实现就比较简单了.代码如下:

//插入排序(升序

void InsertSort(int* a, int n)

{

    for (int i = 1; i < n; i++)

    {

        int end = i - 1;

        int tmp = a[i];

        //将tmp插入到[0,end]这个有序表的区间里




        while (end >= 0)

        {

            if (tmp < a[end]) //如果tmp小于比对元素,将比对元素向后挪

            {

                a[end + 1] = a[end];

                end--;

            }

            else //如果tmp不小于比对元素,将tmp插入到比对元素后面

            {

                break;

            }

        }

        a[end + 1] = tmp;

    }

}


📌直接插入排序的时间度分析

🎏最好情况时间

直接排序的最好情况是每个tmp向前插入发现自己恰好不小于前面有序表中的最后一个元素,这时就直接将自己放在自己原本的地方就可以继续向前插入下一个元素了,即完全的情况:

​编辑

易得此时的:

算法行次数: 编辑

算法时间: ​编辑


🎏最坏情况时间

直接插入的最坏情况是遇到每一个tmp都直到比到前面有序表的0号位置才插入,即完全逆序的情况:

​编辑

此时算法每趟的交换次数累加起来就是1 + 2 + ...... +(n-2)+(n-1),可以发现当算法执行结束,所有次数累加起来恰好是一个等差数列,我们利用求和公式可得:

算法次数: ​编辑

算法时间: 编辑


📌直接插入排序的

我们通过对前面直接插入排序的分析可以发现,当整体完全逆序时:

算法的次数:

算法的次数:​编辑

​编辑


但是如果我们面对的是前后两部分分逆序的数组时:

算法的次数:

算法的次数:

​编辑

此时算法的效率就提高了:


如果我们再分为前后四部分逆序的数组时:

算法的次数:

算法的次数:

​编辑

此时算法的效率又提高了:


通过前面的分析,我们可以发现,随着我们分的部分的增加,算法的行次数在有律的减少:

分成k部分算法次数有如下关系:

如果我们令k无限大,此时算法的执行次数就可以忽略n^2项,而只剩下1/2n项了

其实k无限大的情况,就是被分只有前后两个元素逆序的情况:

​编辑

这种情况下,算法的次数:(1+1+......+1+1)

算法的次数:

通过上面的分析,我们可以得到一个结论:

元素越接近基本有序,直接插入排序算法的时间度就会越低.

那么我们是不是可以在正式行插入排序之前元素先简单"排序"一下呢,即在预排序中,我们尽量将大一些的元素放在数靠后的位置,小一些的元素放在数靠前的位置,这样再进行直接插入排序就能使效率提高很多.

如果你能够理解这一直接插入排序算法的化思路,那么恭喜你,你已经理解了排序的思想,接下来我会在另一篇博客中,详细介绍怎样过这一思路化直接插入排序算法,最终构造出非常著名的排序算法.

感兴趣的朋友可以直接点击下方文章链接查看排序算法的相关内容:

【数据 构】八大排序之希 排序 https://blog.csdn.net/weixin_72357342/article/details/135043566


结语

希望直接插入排序算法解能大家有所帮助,迎大佬留言或私信与我交流.

有关更多排序相关知可以移步:

【数据 构】八大排序算法 https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学,一起!

 相关文章推荐

【数据 构】八大排序之冒泡排序算法

【数据 构】八大排序之希 排序算法

【数据 构】八大排序之直接插入排序算法

【数据 构】八大排序之 简单选择 排序

【数据 构】八大排序之堆排序算法

【数据 构】八大排序之快速排序算法

【数据 构】八大排序算法之 并排序算法

【数据 构】八大排序之 数排序算法


数据构排序算法篇思维导图:编辑


​编辑

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。