• 【21天学习经典算法】插入排序(附Python完整代码)


    前言

    博主一头小山猪目前已开放文章
    一文学懂经典算法系列之:顺序查找(附讲解视频)
    一文学懂经典算法系列之:直接插入排序(附讲解视频)

    活动地址:CSDN21天学习挑战赛

    正文

    插入排序的定义、工作方式

    插入排序的定义
    输入:一组个数为 n n n的序列 ⟨ a 1 , a 2 , ⋯   , a n ⟩ \left\langle a_{1}, a_{2}, \cdots, a_{n}\right\rangle a1,a2,,an
    输出:对输入序列的一个排列 ⟨ a 1 ′ , a 2 ′ , ⋯   , a n ′ ⟩ \left\langle a_{1}^{\prime}, a_{2}^{\prime}, \cdots, a_{n}^{\prime}\right\rangle a1,a2,,an,其中满足 a 1 ′ ⩽ a 2 ′ ⩽ ⋯ ⩽ a n ′ a_{1}^{\prime} \leqslant a_{2}^{\prime} \leqslant \cdots \leqslant a_{n}^{\prime} a1a2an
    排序的数也被称为关键词,虽然在概念上我们在对一个序列进行排序,但是输入是以 n n n个元素的数组的形式出现的,总而言之,也就是对一组部分无序或部分有序的数组进行排列。
    插入排序的工作方式
    插入排序的工作方式就像排序一手扑克牌,在开始时,我们的左手为空并且桌子上的牌面朝下,然后我们每次从桌子上拿走一张牌井将它插入手中正确的位置。为了找到一张牌的正确位置,我们从右到左(或从右至左)将它与已在手中的每张牌进行比较, 如图所示,开始时这些牌是桌子上牌堆中牌面朝下的顶部的牌,但拿在手上的牌总是排序好的。
    在这里插入图片描述
    伪代码
    INSERTION ( A ) : (A): (A):

    1 for j = 2 to len(A)
    2 		key = A[j]
    3		//Insert A[j] into the sorted sequence A[1...j-1]
    4		i = j-1
    5		while i > 0 and A[i] > key
    6		A[i+1] = A[i]
    7		i = i-1
    8		A[i+1] = key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    伪代码解析
    对于插入排序,本文将其伪代码过程命名为INSERTION,其中的参数是一个数组 A [ 1... n ] A[1...n] A[1...n],包含长度为 n n n的要排序的一个序列。在Python代码中, A A A中元素的数目 n n n l e n ( A ) len(A) len(A)来表示。该算法原址排序输人的数:算法在数组 A A A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面。在过程INSERTION-SORT结束时,输出数组 A A A包含排序好的输出序列。

    对于插入排序的理解
    插入排序也可以这么理解,首先我们有一组部分无序或部分有序的数组,称为数组 A A A,之后我们生成一个空数组,称为数组 B B B。我们对数组 A A A进行从左至右地取出数组内的内容放入数组 B B B中,在放入的过程当中,我们需要做一个动作,就是比较大小,比较完之后,将 “小” 的数字放在 “大” 的数字之前即可。

    Python代码实现插入排序

    代码实现两种排序方式,第一种方式是采用增加一个空数组,该数组存储用户对于该数组由小到大或由大到小的排序,第一种排序方式是为了验证插入排序的正确性。第二种方式就是文中提到的插入排序,通过比较数组中数字间的大小,最终形成一组排序后的数组。

    首先设一个数组 A A A

    A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84]
    
    • 1

    空数组排序

    # Insertion_Sort.py
    A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84, 84]
    
    # Mode 1
    Mode1_B = []
    for i in range(len(A)):
        Mode1_B.append(min(A))
        A.remove(min(A))
        # 使用remove函数的优势在于,如果A数组中有重复的数值,也能计算得到。
    print(Mode1_B)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    插入排序

    # Mode 2
    def insertion_sort(A):
        for i in range(0, len(A)):
            index = i
            # 只要数组A的当前索引值小于前一个索引值,且当前索引位大于等于第一位。
            while A[index - 1] > A[index] and index - 1 >= 0:
                # 将当前索引位置与前一位的位置互换
                A[index], A[index - 1] = A[index - 1], A[index]
                # 互换后索引位置前移,比较该数值经历了互换位置之后,与前一个索引值的大小
                # 主要是为了判断是否需要再次互换位置
                index -= 1
        return A
    
    
    A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84, 84]
    print(insertion_sort(A))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    以上就是个人在插入排序中的理解,如果错误之处,还望指正。

    参考资料

    1. 小山猪——经典算法专栏
    2. 数据结构教程 第5版
    3. 插入排序(Python实现)
  • 相关阅读:
    leetcode: 122. 买卖股票的最佳时机II
    【Redis使用】一年多来redis使用笔记md文档,第(2)篇:命令和数据库操作
    Python 爬虫 / web 面试常见问题
    牛客在线编程101-17 二分查找-I
    进程间通信IPC-管道
    算法刷题day47
    第08章 Tableau在线服务器
    Python提取JSON数据中的键值对并保存为.csv文件
    portswigger网站sqli lab答案
    投资 - 股市顺势加仓方式
  • 原文地址:https://blog.csdn.net/AlbertDS/article/details/126137989