数组排序简介-插入排序(Insertion Sort)

基本思想

        将数组分为两个区间:左侧为有序区间,右侧为无序区间。每趟从无序区间取出一个元素,然后将其插入到有序区间的适当位置。

        插入排序在每次插入一个元素时,该元素会在有序区间找到合适的位置,因此每次插入后,有序区间都会保持有序。

算法步骤

        假设数组的元素个数为 n 个,则插入排序的算法步骤如下:

  1. 初始状态下,有序区间为 [0,0],无序区间为 [1,n−1]。
  2. 第 11 趟插入:
    1. 取出无序区间 [1,n−1] 中的第 1个元素,即 nums[1]。
    2. 从右到左遍历有序区间中的元素,将比 nums[1] 小的元素向后移动 1 位。
    3. 如果遇到大于或等于 nums[1] 的元素时,说明找到了插入位置,将 nums[1] 插入到该位置。
    4. 插入元素后有序区间变为 [0,1],无序区间变为 [2,n−1]。
  3. 第 2 趟插入:
    1. 取出无序区间 [2,n−1]中的第 11 个元素,即 nums[2]。
    2. 从右到左遍历有序区间中的元素,将比 nums[2] 小的元素向后移动 1 位。
    3. 如果遇到大于或等于 nums[2] 的元素时,说明找到了插入位置,将 nums[2] 插入到该位置。
    4. 插入元素后有序区间变为 [0,2],无序区间变为 [3,n−1]。
  4. 依次类推,对剩余无序区间中的元素重复上述插入过程,直到所有元素都插入到有序区间中,排序结束。

        我们以 [5,2,3,6,1,4] 为例,演示一下插入排序算法的整个步骤。

适用情况

        插入排序适用于已有部分数据有序的情况,有序部分越大越好。

排序稳定性

        在插入操作过程中,每次都讲元素插入到相等元素的右侧,并不会改变相等元素的相对顺序。因此,插入排序方法是一种 稳定排序算法

代码实现(golang)

func insertionSort(arr []int) {
    n := len(arr)
    for i := 1; i < n; i++ {
       key := arr[i]
       j := i - 1
       for j >= 0 && arr[j] > key {
          arr[j+1] = arr[j]
          j--
       }
       arr[j+1] = key
    }
}

func main() {
    arr := []int{5, 2, 4, 6, 1, 3}
    insertionSort(arr)
    fmt.Println(arr) // 输出 [1 2 3 4 5 6]
}

猜你喜欢

转载自blog.csdn.net/Runing_WoNiu/article/details/143315529