手写插入排序

本文通过类比人类按字母顺序整理卡片的过程,深入浅出地介绍了插入排序算法的工作原理。文章详细解释了插入排序的双循环机制:外循环遍历数组元素,内循环负责比较并移动元素以维持已排序部分的有序状态。最后,通过具体示例展示了插入排序的执行过程,揭示了其算法复杂度为O(n^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序类似于人类按数字或字母顺序对数据进行排序。例如,让班里的每个学生上交一张写有他的名字、学生证号以及个人简介的索引卡片。学生交上来的卡片是没有顺序的,但是我想让这些卡片按字母顺序排好,这样就可以很容易地与班级花名册进行对照了。

我将卡片带回办公室,清理好书桌,然后拿起第一张卡片。卡片上的姓氏是 Smith 。我把它放到桌子的左上角,然后再拿起第二张卡片。这张卡片上的姓氏是 Brown 。我把 Smith右移,把 Brown 放到 Smith 的前面。下一张卡片是 Williams ,可以把它放到桌面最右边,而不用移动其他任何卡片。下一张卡片是 Acklin 。这张卡片必须放在这些卡片的最前面,因此其他所有卡片必须向右移动一个位置来为 Acklin 这张卡片腾出位置。这就是插入排序的排序原理。

插入排序有两个循环。外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那么数组元素会向右移动,为内循环中的这个元素腾出位置,就像之前介绍的姓氏卡片一样。

下面展示了插入排序的代码

function insert_sort (A) {
  for (let j = 1, len = A.length; j < len; j++) {
    const key = A[j]
    let i = j - 1
    while (i >= 0 && A[i] > key) {
      A[i + 1] = A[i]
      i--
    }
    A[i + 1] = key
  }
}

如果把数组 [5, 4, 3, 2, 1] 进行排序

第1轮要进行1次比较,得到4, 5, 3, 2, 1

第2轮要进行2次比较,得到3, 4, 5, 2, 1

第3轮要进行3次比较,得到2, 3, 4, 5, 1

第4轮要进行4次比较,得到1, 2, 3, 4, 5

算法复杂度是O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值