码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【学习挑战赛】经典算法之直接插入排序


    ✅作者简介:C/C++领域新星创作者,为C++和java奋斗中
    ✨个人社区:微凉秋意社区
    🔥系列专栏:经典算法
    📃推荐一款模拟面试、刷题神器👉注册免费刷题

    🔥前言

    今天给大家带来直接插入排序这一经典算法的概念、实现以及效率分析,并使用具体题目来巩固练习。基础算法都不会难的,但是并不代表不重要,在思考的过程中可以锻炼自己思维能力。
    挑战赛活动地址: CSDN21天学习挑战赛

    文章目录

    • 直接插入排序算法解析
      • 一、理解直接插入排序思想
        • 1、算法思想
        • 2、和扑克牌类比
      • 二、算法分析
        • 1、算法流程
        • 2、实现步骤
      • 三、代码实现
        • 1、源码及运行效果
        • 2、代码过程解析
        • 3、时间复杂度分析

    直接插入排序算法解析

    一、理解直接插入排序思想

    1、算法思想

    每次从原有数据中取出一个数,插入到之前已经排好的序列中,直到所有的数全部取完,那么新的有序排列也就完成了。

    2、和扑克牌类比

    首先他是一个排序算法,因此最终结果一定是一组有序的元素(一般为升序排列),那么就可以类比为扑克中我们手牌的顺序。当我们有牌的情况下摸牌,是不是会习惯性的将新摸到的牌与老牌做一个排序,那么这种用新牌与老牌比较并插入到手牌的方法与直接插入排序方法思想别无二致。

    二、算法分析

    1、算法流程

    在这里插入图片描述

    2、实现步骤

    1. 从第二个元素开始与第一个元素的大小进行比较:如果比他大,不进行操作,如果比他小,进行交换操作。
    2. 第二个元素之后的元素挨个与前面的元素值比较且该元素被单独变量记录,如果该元素比前面相邻元素小,直接用相邻元素覆盖此元素下标对应的值,此时该元素的下标往前移动。
    3. 当前面元素值都小于该值,将此值插入即可。

    三、代码实现

    1、源码及运行效果

    #include
    using namespace std;
    //直接插入排序
    void dirInsert(int *arr,int len)
    {
    	for (int i = 1; i < len; i++) 
    	{
    		int key = arr[i];	//key是待比较的元素值
    		int temp = i - 1;	//temp是相邻的元素下标
    		while (temp >= 0 && arr[temp] > key)
    		{
    			arr[temp+1] = arr[temp];
    			temp--;
    		}
    		arr[++temp] = key;
    	}
    }
    //给数组arr赋随机值
    void randArr(int* arr, int len)
    {
    	srand((unsigned int)time(NULL));//随机数种子
    	for (int i = 0; i < len; i++) {
    		int value = rand() % 100 + 1;
    		arr[i] = value;
    	}
    }
    //查看当前数组元素
    void showInfo(int *arr,int len)
    {
    	for (int i = 0; i < len; i++) {
    		cout << arr[i] << " ";
    	}
    	cout << endl;
    }
    int main(void)
    {
    	int len = 0;
    	cout<<"请输入数组大小:";
    	cin >> len;
    	int* arr = new int[len];
    	randArr(arr,len);	//调用randArr给数组arr赋值
    	cout << "插入排序前数组元素为:" << endl;
    	showInfo(arr, len); //调用showInfo查看数组元素
    	dirInsert(arr, len);//调用直接插入排序
    	cout << "插入排序后数组元素为:" << endl;
    	showInfo(arr, len);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在这里插入图片描述

    2、代码过程解析

    1. 利用随机数给数组arr赋值,对应的函数为randArr
    2. 直接插入排序函数dirInsert,这个也是本文的核心内容,用来做元素排序
    3. 查看元素函数showInfo查看排序前后的元素情况

    3、时间复杂度分析

    讨论最好和最坏的情况:

    1. 最好的情况:
      • 该序列为升序排列,不需要进行元素移动,那么相当于遍历了n次,时间复杂度为O(n)。
    2. 最坏的情况:
      • 该序列为降序排列,每次都需要移动数据,那么在遍历n次的情况下,while循环中又执行了n-1次,非常接近n的平方,因此时间复杂度为O( n 2 n^{2} n2)

    写在最后

    快来一起打下算法基础,共同成长进步吧!!!

  • 相关阅读:
    Android Jetpack 中Hilt的使用
    使用mmdetection做实例分割
    详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读
    50从零开始用Rust编写nginx,原来TLS证书还可以这么申请
    Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】
    “益路同行”栏目人物专访 第0010期——中国公益万里行发起人李现
    基于雪花算法的增强版ID生成器
    [go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目
    RPA的实施过程通常包括哪些步骤?
    Qt学习总结之QSpinBox
  • 原文地址:https://blog.csdn.net/m0_58618795/article/details/126152229
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号