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

1.1.3 插入排序

插入排序

1. 原理

时间复杂度O(N^2),额外空间复杂度O(1)
算法流程按照最差情况来估计时间复杂度0~0 上有序
0~1上有序,从1往前看,if 当前数小于左边的数,就一直往前进行交换。
0~2上有序,从2往前看,if 当前数小于左边的数,就一直往前进行交换。
0~3上有序,从3往前看,if 当前数小于左边的数,就一直往前进行交换。
......
0~n-1上有序,从n-1往前看,if 当前数小于左边的数,就一直往前进行交换。例子
arr = [12, 11, 13, 5, 6]
ind = [0,   1,  2, 3, 4]有序部分, 无序部分
开始:[]      arr
0~0: arr[0] 有序[0,   1,  2, 3, 4][12, 11, 13, 5, 6][12]
0~1:  arr[1]: 11 > 12, swap, 有序部分[0,   1,  2, 3, 4][12, 11, 13, 5, 6]    arr[0] > arr[1],  swap(arr, 0, 1)[11, 12, 13, 5, 6]
0~2: arr[2] > arr[1], continue
0~3:[0,   1,  2, 3, 4][11, 12, 13, 5, 6]   arr[2] > arr[3],  swap(arr, 2, 3)[11,  5, 12, 13, 6]   arr[1] > arr[2],  swap(arr, 1, 2)[5,  11, 12, 13, 6]   arr[0] > arr[1],  swap(arr, 0, 1)0~4:
[0,   1,  2, 3, 4]
[5,  11, 12, 13, 6]   arr[3] > arr[4],  swap(arr, 3, 4)
[5,  11, 12, 6, 13]   arr[2] > arr[3],  swap(arr, 2, 3)
[5,  11, 6, 12, 13]   arr[1] > arr[2],  swap(arr, 1, 2)
[5,  6, 11, 12, 13]   ok插入排序的原理
插入排序的基本思想是将数组分成两个部分:已排序部分和未排序部分。
1. 初始状态:已排序部分包含数组的第一个元素,未排序部分包含剩余的元素。
2. 从未排序部分取出第一个元素,将其插入到已排序部分的适当位置。
3. 重复步骤 2,直到未排序部分为空。插入排序的时间复杂度
- **最坏情况时间复杂度**:O(n^2),当数组是反序时。
- **最佳情况时间复杂度**:O(n),当数组已经有序时。
- **平均情况时间复杂度**:O(n^2)。插入排序的空间复杂度 O(1)
插入排序的稳定性
插入排序是一个稳定的排序算法,因为相等元素的相对顺序不会改变。

2. code

插入排序


from test1 import *
def insertionSort(arr):if arr == [] or len(arr) < 2:returnfor i in range(1, len(arr)):for j in range(i-1, -1, -1):if arr[j] > arr[j + 1]:swap(arr, j, j + 1)else:breakreturn# for test
def main():testTime =  50000              # 500000maxSize = 100maxValue = 100succeed = Truefor i in range(testTime):arr1 = generateRandomArray(maxSize, maxValue)arr2 = copyArray(arr1)insertionSort(arr1)             # ------------------test-------------------------comparator(arr2)if (not isEqual(arr1, arr2)):succeed = FalseprintArray(arr1)printArray(arr2)breakif succeed:print("Nice!")else:print("Fucking fucked!")arr = generateRandomArray(maxSize, maxValue)printArray(arr)insertionSort(arr)printArray(arr)if __name__ == '__main__':main()

补充

在这里插入图片描述


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

相关文章:

  • Java并发编程笔记
  • 为什么DeepSeek服务器繁忙?
  • 论文解读 | NeurIPS'24 Spotlight ChronoMagic-Bench 评估文本到视频生成的质变幅度评估基准...
  • python开发:爬虫示例——GET和POST请求处理
  • 0207算法:寻找目标值、库存管理
  • 大模型常见术语的扫盲
  • GNU链接器简介
  • MAC环境安装(卸载)软件
  • 数据结构C语言描述8(图文结合)--哈希、哈希冲突、开放地址法、链地址法等实现
  • Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
  • Kraft模式安装Kafka(含常规、容器两种安装方式)
  • 【操作系统不挂科】操作系统期末考试题库<1>(单选题&简答题&计算与分析题&应用题)
  • ARM CCA机密计算安全模型之固件更新
  • 代码实战:基于InvSR对视频进行超分辨率重建
  • Unity-Mirror网络框架-从入门到精通之Benchmark示例
  • 1.1.2.1 选择 + 冒泡排序
  • Oracle 11g rac + Dataguard 环境调整 redo log 大小
  • 与 Oracle Dataguard 相关的进程及作用分析
  • 1.1.7 master公式的使用
  • 1.2.1 归并排序
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
  • 三子棋游戏
  • web漏洞之文件包含漏洞
  • 模型训练二三事:参数个数、小批量、学习率衰减、输入形状
  • SCAU期末笔记 - 数据库系统概念往年试卷解析
  • MyBatis执行一条sql语句的流程(源码解析)