当前位置: 首页 > news >正文

数组排序简介-插入排序(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 - 1for 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]
}


http://www.mrgr.cn/news/60726.html

相关文章:

  • YOLO框架最新综述从YOLOV1-YOLOV11(2024年10月23)
  • 【51单片机】矩阵键盘
  • 数据库->数据库设计
  • Vue.js 组件开发
  • SwiftUI(五)- ForEach循环创建视图尺寸类安全区域
  • TQZC706开发板教程:ADRV9009观测双通道接收波形
  • 阿里巴巴运营技巧分享
  • 【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓
  • Ubuntu虚拟机的安装以及相关文件配置(保姆级攻略)
  • 多个立方体盒子组成
  • HTML的总结作业
  • C++设计模式创建型模式———简单工厂模式、工厂方法模式、抽象工厂模式
  • MambaAD 5总结 分析
  • 前端必备的环境搭建
  • 一文理解平流层温度变化规律
  • Java中如何在两个线程间共享数据
  • 监控易系统:引领智能阈值管理与网络设备监控的创新
  • 信号 和 槽
  • “雷鸟效应”引领全民AR新纪元:专注影音体验,打造消费级AR天花板
  • 理想传输线等效模型与特性阻抗
  • 实现RPC接口的demo记录
  • Windows端口管理与进程控制
  • redis数据类型介绍
  • EXPORT_SYMBOL 底层原理
  • (蓝桥杯C/C++)—— 编程基础
  • Lomda表达式与函数式接口