首页 > 编程语言 >漫画:什么是插入排序算法?

漫画:什么是插入排序算法?

时间:2023-03-17 22:46:26浏览次数:59  
标签:arr 插入排序 元素 算法 漫画 一尘 排序

面试官:聊聊插入排序

插入排序是一种比较简单直观的排序算法,适用处理数据量比较少或者部分有序的数据,今天我们来聊聊插入排序

一、排序思想

image-20210423184412971

image-20210423184329505

image-20210423184437685

image-20210423184457704

只见慧能拿出了一副牌,洗了洗牌,然后放在桌子上,从牌顶摸了几张牌

image-20210423184519197

image-20210423184543609

说着说着慧能又摸了一张牌

image-20210423184610503

image-20210423184630606

image-20210423184652134

一尘不假思索地回答道

image-20210423184723708

怎么判断?这一下还把小一尘给问愣住了,但是细想了一下整个过程,一尘答道

image-20210423184801128

image-20210423184813133

image-20210423184840117

突然之间又学了一个知识点,每次知识都来得猝不及防,一尘心里想到

image-20210423185022923

慧能拿来了笔和纸准备详细地说说

image-20210423185107086

image-20210423185147855

image-20210423185221545

image-20210423185234121

image-20210423185304684

image-20210423185313589

image-20210423185333929

image-20210423185352542

二、代码

image-20210423185450069

image-20210423185507782

早知道就不说这句话了,一尘心里想,但师命难违,还是硬着头皮想了想

一尘:首先我用一个数组存储要排序的数据(无序)

image-20210423185602182

然后我用for循环从前到后遍历整个数组,将无序元素一个一个地插入到正确的位置(排好序的位置),第一个元素我认为它是排好序的,所以我从第二个元素开始遍历

image-20210423185621375

随后,小一尘写下了如下代码

public static void insertionSort(int [] arr) {
  for (int i = 1; i < arr.length; i++) {
    // 将 arr[i] 插入到正确的位置
    inserToRightPosition(arr, i);
  }
}

image-20210423185909623

一尘解释道

image-20210423185956327

一尘:是啊,这个怎么实现呢?咦,我可以用一个临时变量把待插元素(将要插入到有序集合的元素)存起来,然后逐个和有序集合里的元素比较,如果集合里的元素大于待插元素,就将它向后移动一个单元,这样当遇到有序集合中小于等于待插元素的元素时就有地方放待插元素了

image-20210423190105561

image-20210423190118226

image-20210423190129227

小一尘又把插入方法(insertToRightPosition)实现了

private static void inserToRightPosition(int[] arr, int i) {
  // 备份待插元素
  int inserted = arr[i];
  int j = i - 1;
  for(; j >= 0 && arr[j] > inserted; j--) {
    arr[j + 1] = arr[j]; // 将比待插元素大的元素后移
  }
  // 将待插元素插入正确的位置
  arr[j + 1] = inserted;
}

i 指向待插元素,j 会遍历有序数组中所有元素,直到找到合适的位置将待插元素(inserted)插入

image-20210423190444578

image-20210423190505440

三、时间复杂度

image-20210423190539440

下面讨论最坏时间复杂度,即所有元素倒序

这段代码最耗时的地方就花在最内层for循环里面的操作上(比较和移动)了,我只要大概估算出这些操作执行的次数就可以了

对于n个元素,首先我的外层for循环要循环n-1次

image-20210423190609828

然后insertToRightPosition里的内层for循环的循环次数是根据 i 来决定的,i = 1时,循环 1 次,i = 2,循环 2 次,...,i = n-1,循环 n-1次,那总共加起来就是

image-20210423190628567

根据复杂度计算规则,保留高阶项,并去掉系数,那么时间复杂度为O(n^2)

image-20210423190658138

image-20210423190723834

四、稳定性

image-20210423190848061

image-20210423190901155

image-20210423190932872

image-20210423191323180

更多排序算法文章

1. 漫画:什么是冒泡排序算法?

2. 漫画:什么是选择排序算法?

3. 漫画:什么是插入排序算法?

4. 漫画:什么是希尔排序算法?

5. 漫画:什么是归并排序算法?

6. 漫画:什么是快速排序算法?

7. 漫画:什么是堆排序算法?

8. 漫画:什么是基数排序算法?

9. 漫画:什么是外部排序?

10. 什么是计数排序?

11. 十大排序算法极简汇总篇

推荐阅读

下载破 2w+,在校生必看,《程序员内功修炼》第二版出炉

从双非到大厂,帅地写了一本原创PDF送给大家

一个帮你拿offer的校招网站

算法刷题路线(系统+全面)

作者简介:我是帅地,校招拿到过不少大厂offer,毕业去了腾讯研发岗,毕业半年整到人生第一个 100 万,目前专注于写大学规划 + 校招求职相关的内容,著有个人原创网站 PlayOffer

标签:arr,插入排序,元素,算法,漫画,一尘,排序
From: https://www.cnblogs.com/kubidemanong/p/17228491.html

相关文章

  • 漫画:什么是归并排序算法?
    归并排序是建立在归并操作的一种高效的排序方法,该方法采用了分治的思想,比较适用于处理较大规模的数据,但比较耗内存,今天我们聊聊归并排序一、排序思想一天,小一尘和慧能......
  • 漫画:什么是希尔排序算法?
    希尔排序(ShellSort)是以它的发明者DonaldShell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错一、排序思想前情回顾:漫画:什么是插入排......
  • 漫画:什么是堆排序算法?
    面试官:写一个堆排吧堆排是基于堆的一种排序算法,对于堆的了解,请看可以管理时间的二叉堆(如果对堆的插入和删除不清楚,强烈建议先看堆),今天我们聊聊堆排的思想,复杂度以及稳定......
  • 漫画:什么是快速排序算法?
    这篇文章,以对话的方式,详细着讲解了快速排序以及排序排序的一些优化。一禅:归并排序是一种基于分治思想的排序,处理的时候可以采取递归的方式来处理子问题。我弄个例子......
  • 代码随想录算法训练营Day45 动态规划
    代码随想录算法训练营代码随想录算法训练营Day45动态规划|70.爬楼梯(进阶)322.零钱兑换70.爬楼梯(进阶)题目链接:70.爬楼梯(进阶假设你正在爬楼梯。需要n 阶你才能......
  • Qz学算法-数据结构篇(非线性结构、树)
    非线性结构非线性结构包括:二维数组,多维数组,广义表,树结构,图结构树树结构为什么需要树结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找......
  • 使用简单算法两小时实现猎杀乌姆帕斯(Hunt the Wumpus)Python小游戏
    “HunttheWumpus”是什么?引用wiki百科:HunttheWumpus是GregoryYob于1973年开发的一款基于文本的冒险游戏。在游戏中,玩家在一系列连接的洞穴中穿行,这些洞穴排列......
  • 分布式协议与算法实战 - 分布式算法 paxos raft
    paxos算法用于分布式共识,分成2部分BasicPaxos算法,描述多节点间如何就某个值达成共识Multi-Paxos算法,执行多个BasicPaxos实例,就一系列值达成共识BasicPaxos三种角......
  • 基础算法模板之区间离散化与合并
    区间离散化将数量很少但数值很大的区间下标有序映射到一个集中的区间内,并可以根据原下标x迅速找到(二分)新下标vector<int>alls;//存储所有可能下标sort(alls.begin(......
  • 基础算法模板之前缀和与差分
    前缀和规定数列{\(a_i\)}的前缀和为\(S_i\)=\(\sum{_{k=1}^i}a_k\),常用于使用o(1)的时间计算某段区间求和//一维前缀和S[i]=S[i-1]+a[i];//前缀和初始化,i......