1.1.3 插入排序

插入排序

1. 原理

python 复制代码
时间复杂度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

插入排序

python 复制代码
from test1 import *
def insertionSort(arr):
    if arr == [] or len(arr) < 2:
        return
    for 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:break
    return

# for test
def main():
    testTime =  50000              # 500000
    maxSize = 100
    maxValue = 100
    succeed = True
    for i in range(testTime):
        arr1 = generateRandomArray(maxSize, maxValue)
        arr2 = copyArray(arr1)
        insertionSort(arr1)             # ------------------test-------------------------
        comparator(arr2)
        if (not isEqual(arr1, arr2)):
            succeed = False
            printArray(arr1)
            printArray(arr2)
            break
    if succeed:
        print("Nice!")
    else:
        print("Fucking fucked!")

    arr = generateRandomArray(maxSize, maxValue)
    printArray(arr)
    insertionSort(arr)
    printArray(arr)

if __name__ == '__main__':
    main()
相关推荐
Shaoshing9 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_39 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
loulanyue_10 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院10 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan10 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生11 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan11 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
大雄很用心11 小时前
如何理解时间复杂度与空间复杂度?| 面试刷题笔记02
算法
姜鱼问生11 小时前
服务器磁盘满了?从告警到清理的完整排查
后端·算法·架构