美文网首页
排序:插入排序

排序:插入排序

作者: 菲利普马洛 | 来源:发表于2019-01-01 17:59 被阅读1次

原理

插入排序,顾名思义,以“插入”来实现排序。
那怎么插入呢?
以数组来说,插入是将一个元素放到一个有序数组的适当位置,保证插入后的数组依然有序。
我们可以将一个数组拆分成有序和无序两部分,然后将无序数组当中的元素一个个插入到有序的数组中。

例子

假如给定一个无序数组:

[5, 2, 7, 3]

要求将这个数组进行升序排列。

首先将这个数组拆分成两个部分:

[(5), (2, 7, 3)]

左边的部分只有一个元素,我们将它视为有序的。
然后将右边部分的元素一个个插入左边。

[(5, 2), (7, 3)]

此时,2 是新插入的元素。将它与原来的 5 比较,发现比 5 小,所以将它移动到适当的位置:

[(2, 5), (7, 3)]

此时,左边的数组保持有序。

接下来插入的元素是 7

[(2, 5, 7), (3)]

待插入的元素依次与它左边的元素比较。这里是 75 比较。
发现 75 大,所以直接将 7 放在左边的末尾即可,无需再移动位置。

这里需要注意的是,在 7 插入之前,左边是有序的,可知最大的元素 5 就在末尾。
而新插入的 7 比左边的最大元素还大,可直接放到末尾,无需再与左边的其它数字比较。
我好啰嗦。

然后我们将右边部分的最后一个数字 3 插入左边的部分。

[(2, 5, 7, 3),()]

右边空了。将 3 依次与左边原来的数字比较。

37 比,比 7 小,所以放在 7 左边:

[2, 5, 3, 7]

接下来与 5 比,比 5 小,放在 5 左边:

[2, 3, 5, 7]

然后和 2 比, 比 2 大。好,辛苦了,不用动了。

这样就排好了:

[2, 3, 5, 7]

代码

/**
 * 指定数组,交换数组中两个元素的位置
 * @param {Array} list 数组
 * @param {Number} i 元素 1 的索引
 * @param {Number} j 元素 2 的索引
 */
const swap = (list, i, j) => {
  let temp = list[i]
  list[i] = list[j]
  list[j] = temp
}

// 插入排序
const insertSort = (list) => {

  for (let i = 1; i < list.length; i++) {
    for (let j = i; j > 0 && list[j] < list[j - 1]; j--) {
        swap(list, j, j - 1)
    }
  }

  return list
}

代码中的索引 i 以及 i 之前的元素可理解为数组左边的部分,j 即是新插入元素的索引。

相关文章

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • 算法(排序)

    一、内部排序 1、插入排序—直接插入排序(Straight Insertion Sort) 2、插入排序—希尔排序...

  • Java排序算法

    插入排序 直接插入排序 折半插入排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 其他排序 二路...

  • 一遍文章搞定插入排序-java版

    插入排序 1.1 插入排序的基本介绍 插入排序属于内排,就是以插入的方式来达到排序的目的 1.2 插入排序思想 将...

  • 排序(新排版)

    冒泡排序 插入排序 二分插入排序 希尔排序 选择排序 快速排序

  • iOS算法

    排序方法 选择排序:直接选择排序、堆排序。 交换排序:冒泡排序、快速排序。 插入排序:直接插入排序、二分法插入排序...

  • Java学习记录(常用 算法 排序 )

    排序算法的分类如下: 1.插入排序(直接插入排序、折半插入排序、希尔排序);2.交换排序(冒泡泡排序、快速排序);...

  • 排序——插入排序

    业精于勤荒于嬉 插入排序包括:直接插入排序、折半插入排序、希尔排序(缩小增量排序) 一、直接插入排序 1. 算法思...

网友评论

      本文标题:排序:插入排序

      本文链接:https://www.haomeiwen.com/subject/viznlqtx.html