数据结构与算法(Dart)之插入排序(十四)

将数组分为已排序和未排序两部分,每次从未排序的部分取出一个元素插入到已排序部分的适当位置。

稳定性 根据查入的位置,插入排序在排序的过程中,始终保持元素的在整体元素中的相对位置不变,所以是稳定的排序算法。

时间复杂度

  • 在最好的情况下,即是数组本身有序的情况下,只需要遍历一遍即可,这时候的时间复杂度取决于元素个数,为:O(n)。

  • 在最坏的情况下,内外都要循环一次,所以这时候时间复杂度为O(n²)。

  • 平均时间复杂度为:O(n²)

scss 复制代码
/// 插入排序
insertionSort(List<int> src) {
  for (int i = 1; i < src.length; i++) {
    int temp = src[i]; // 将当前元素存储到临时变量 temp 中
    int j = i - 1; // j 表示已排序部分的最后一个元素的索引

    // 在已排序部分从后往前查找,找到合适位置插入当前元素
    while (j >= 0 && temp < src[j]) {
      src[j + 1] = src[j]; // 当前元素比已排序部分的元素小,将元素后移一位
      --j; // 向前遍历
      // 更新排序结果回调
    }
    src[j + 1] = temp; // 插入当前元素到已排序部分的正确位置
    print("第 $i 轮插入");
  }

  print("插入排序, src:$src \n");
}

void main() {
  insertionSort([36, 3, 4, 2, 1, 6, 5, 9, 7, 8, 10]);
}

参考资料

Python 数据结构与算法详解

相关推荐
蒟蒻小袁29 分钟前
力扣面试150题--课程表
算法·leetcode·面试
闻缺陷则喜何志丹32 分钟前
【动态规划】B4336 [中山市赛 2023] 永别|普及+
c++·算法·动态规划·洛谷
不二狗2 小时前
每日算法 -【Swift 算法】电话号码字母组合
开发语言·算法·swift
AL流云。2 小时前
【优选算法】分治
数据结构·算法·leetcode·排序算法
C++ 老炮儿的技术栈7 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
殇者知忧7 小时前
【论文笔记】若干矿井粉尘检测算法概述
深度学习·神经网络·算法·随机森林·机器学习·支持向量机·计算机视觉
mochensage9 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
chengooooooo9 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GUIQU.9 小时前
【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
算法·蓝桥杯·每日一题
weixin_5275504010 小时前
初级程序员入门指南
javascript·python·算法