八大排序算法之直接插入排序(教你用生活的想象,读懂插入算法)

简介: 八大排序算法之直接插入排序(教你用生活的想象,读懂插入算法)

八大排序算法之直接插入排序(教你用生活的想象,读懂直接插入算法)


1,生活小游戏:"算法来源于生活",哈哈哈,还记得玩过的抽牌小游戏吗,你从放在地上的那一堆未知的牌【无序】抽一张牌后,

小脑袋机灵的将抽到的牌放到手中牌【早已被你打理得仅仅有序啦】的某个合适位置后【手中牌保持井井有序】。

手中牌【有序】<-------------------------------- 地上牌【无序】

直接插入排序 == “将牌一张张从地上抽起,然后在手中打理得井井有序”。

2,图解:

59.png

从图解可以知道咱需要“插入”,而本题咱用的存储空间是数组~则涉及到了数组的空间移动问题了

~数组移动是从最后一个元素开始,前一个元素的值赋值给后一个元素。

 

3,简单分析一下过程:一开始,在整体牌中,有序区的牌只有一张,放在第一个位置,无序区的牌就是从第二张到最后一张结束。

然后,咱不断的从无序区【从第二张牌开始直到最后一张牌~一个遍历过程】拿牌插入到有序区的合适位置

【需要通过取出来的牌与已经在有序区的牌比较大小才知道是否合适~也是一个遍历过程,从有序区的第一个位置开始直到

取出的牌 的前一个位置结束】。

 

4,所以:外循环(取出无序区的牌):从第二张牌开始到最后一张牌 【无序区的范围】

               内循环(在有序区找合适位置将取出的牌插入):从第一张牌开始直到 取出的牌 的前一张牌  【有序区的范围】

5,假设,有序区是从小到大排序则咱因为数组移动空间问题,【有序区的范围】从最后一个元素开始移动,

于是乎,也从最后该元素比较起,一旦找到在有序第一个数小于取出的数,则有序区的该数后边便是合适插入位置。

6,比较过程,形象生动用一个想象说明吧,看图解(咱有一个从小到大的赛道跟一个球),当球停止,便也找到合适位置了:

60.png

 

7,直接上代码,分析如上:

for(int i = 2; i <= N; i++){  //外循环,从无序区取出牌
      arr[0] = arr[i];      //arr[0]是哨兵元素,后边再补充哨兵元素的好处
        for(j = i - 1; arr[0] < arr[j]; j--){   //内循环,从有序区最后一个元素开始比较,知道“球”卡住了,便找到合适位置
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = arr[0];
    }

ps:代码优化:【主要是优化在有序区查找那个合适位置,原来咱是从最后一个元素开始比较麻,顺带一起移动元素空间,

优化一下:先找到合适位置,后边再移动空间~二分(折半)查找优化】

✿✿ 先讲清楚在这个有序区找到一个合适位置哈【有序(从小到大)】:
正向思维~咱是从有序区第一个数开始找起,找找找,遇到第一个比【哨兵(待插数)】大的数,
因为从小到大排序,咱知道从这个数开始的后边的数都会比(哨兵元素)大了,于是合适的位置就是这个数的前面;
逆向思维~咱是从有序区最后一个数开始找起,找找找,遇到第一个比【哨兵(待插数)】小的数,
因为从小到大排序,咱知道从这个数开始的前边的数都会比(哨兵元素)小了,于是合适的位置就是这个数的后面;
for(int i = 2; i <= N; i++){  //外循环,从无序区取出牌
    arr[0] = arr[i];      //arr[0]是哨兵元素,后边再补充哨兵元素的好处
        //二分查找,先在有序区找到那个合适位置先
        int low = 1;
        int hight = i - 1;
        while(low <= height){     //不断缩小查找范围
        int mid = (low + height)/2;
          if(arr[0] < arr[mid]){
              height = mid - 1;
          }else{
              low = mid + 1; 
          }
      }
    //移动空间
    for(int j = i - 1; j >= height + 1; j--){   //内循环,从有序区最后一个元素开始比较,知道“球”卡住了,便找到合适位置
      arr[j + 1] = arr[j];
    }
    arr[height + 1] = arr[0];
  }

 


for(int i = 2; i <= N; i++){  //外循环,从无序区取出牌
    arr[0] = arr[i];      //arr[0]是哨兵元素,后边再补充哨兵元素的好处
        //二分查找,先在有序区找到那个合适位置先
        int low = 1;
        int hight = i - 1;
        while(low <= height){     //不断缩小查找范围
        int mid = (low + height)/2;
          if(arr[0] < arr[mid]){
              height = mid - 1;
          }else{
              low = mid + 1; 
          }
      }
    //移动空间
    for(int j = i - 1; j >= height + 1; j--){   //内循环,从有序区最后一个元素开始比较,知道“球”卡住了,便找到合适位置
      arr[j + 1] = arr[j];
    }
    arr[height + 1] = arr[0];
  }

 

8,哨兵元素好处:

 https://wenku.baidu.com/view/9e73cb8b69dc5022aaea00c1.html

(1)不用额外增加辅助空间;

(2)省去对下标越界的判断;

61.png

目录
相关文章
|
4月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
174 0
|
9月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
234 8
算法系列之排序算法-堆排序
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
算法 搜索推荐 测试技术
【调度算法】快速非支配排序算法
【调度算法】快速非支配排序算法
257 3
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
504 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
153 0
数据结构与算法学习十四:常用排序算法总结和对比
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
438 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
102 0
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析

热门文章

最新文章