插入排序 - python

本文介绍了插入排序的基本原理,并通过一个生动的摸牌例子进行解释。代码展示了一个Python实现的插入排序函数,用于对给定列表进行排序。在排序过程中,元素逐个与已排序部分比较并找到合适位置插入,最终完成排序。

插入排序

学习来源: b站 python分享站
插入排序:以下图为例

开始时列表第一个元素看作是手里拿的牌(橙色),即5。
在这里插入图片描述
摸下一张牌7,7比5大,放5右边,
在这里插入图片描述
摸下一张4,此时5和7都比4大,
在这里插入图片描述
5和7往右移,把4放在5和7的左边。
在这里插入图片描述
依次遍历,完成排序。
在这里插入图片描述
代码如下:

# 插入排序
def insert_sort(li):
    for i in range(1, len(li)):  # 摸到牌的下标
        tmp = li[i]   # 摸到的牌
        j = i - 1  # j是手里牌的下标
        while j >= 0 and li[j] > tmp:   # 手里的牌比摸到的牌大
            li[j + 1] = li[j]  # 手里的牌往右移一个空位
            j -= 1
        li[j + 1] = tmp   # 摸到的牌放到手里的牌的右边
        print(li)


li = [3, 6, 8, 1, 6, 4, 9, 2, 7]
print(li)
insert_sort(li)

注:以上面图形为例,摸到的7比手里的5大,不进入while循环,直接放在手里的牌右边。摸下一张牌4,此时 j 指向7,7大于4,7往右移一个空位,j = j-1 此时j指向5(下标为0),5大于4,继续右移一个空位,此时j = j -1 = -1,跳出循环,4放到下标为 j+1 = 0的位置,即第一个5刚移走的位置。

插入排序Insertion Sort)是一种简单直观的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。该算法的时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$,属于原地排序算法[^2]。 以下是一个经典的插入排序Python 实现示例: ```python def insertion_sort(arr): """ 插入排序算法实现 参数: arr -- 待排序的数组 返回值: 排序后的数组 """ n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr # 测试示例 arr = [5, 2, 8, 12, 1, 6, 3, 9] sorted_arr = insertion_sort(arr) print("排序后的数组:", sorted_arr) ``` 该实现中,`key` 是当前需要插入的元素,外层循环遍历数组中的每一个元素(从第二个开始),内层 `while` 循环用于将 `key` 插入到已排序部分的正确位置[^1]。 此外,还有一种实现方式是通过交换的方式进行插入,代码如下: ```python def Insert_Sort(row): for i in range(len(row)): current_index = i while current_index > 0 and row[current_index - 1] > row[current_index]: row[current_index], row[current_index - 1] = row[current_index - 1], row[current_index] current_index -= 1 return row # 测试示例 row = [10, 14, 2, 78, 41, 7, 30, 123, 45, 5] print("排序后的数组:", Insert_Sort(row)) ``` 这种写法通过不断向前交换元素,将当前元素插入到正确位置,直到整个数组有序为止[^4]。 ### 插入排序的特点 - **简单易实现**:逻辑清晰,适合初学者理解和使用。 - **适合小规模数据**:对于数据量较小的场景,插入排序效率较高。 - **原地排序**:不需要额外的存储空间,空间复杂度为 $O(1)$。 - **稳定排序**:插入排序在排序过程中不会改变相同元素的相对顺序[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值