什么是插入排序?
插入排序是一种简单而直观的排序算法,它的工作方式类似于我们手动排序卡片或整理文件:
工作原理:
初始状态:将数组分为两部分:一部分是已排序的(最开始时这部分只包含第一个元素),另一部分是未排序的(包含数组的其余部分)。
排序过程:
取元素:从未排序的部分取出第一个元素,这个元素在逻辑上是“手中拿着的牌”。
寻找位置:将这个元素与已排序部分的元素从后向前依次比较。
插入动作:如果“手中的牌”比比较的元素小(对于升序排序),则将比较的元素向后移动一位,为插入新元素腾出空间。
放置元素:当找到一个已排序的元素小于或等于“手中的牌”,或者已经比较到了已排序部分的第一个元素时,将“手中的牌”放在这个位置上。
重复过程:重复上述过程,每次将未排序部分的第一个元素插入到已排序部分的正确位置,直到未排序部分没有元素为止。
插入排序的工作原理
假设我们有一个未排序的数列 [7, 2, 4, 9, 3]
,我们希望对其进行升序排序。
插入排序的代码示例(Python)重点重点重点讲解
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
#插入排序是从后往前比较的
#当前选中的元素与其前一个比较,如果有序,则不需要调换位置
#如果无序,则需要换位置
j = i-1 #这一行代码就是去到位置i的前一个元素的位置
#当j>=0不用解释,索引不能够为负数
#key是位置j前面的元素,判断a[j]与a[j-1]的大小,如果不是有序的就要调整位置
while j >=0 and key < arr[j]:
#到了while内部说明不是有序的,需要调整,把大的往后移
arr[j+1] = arr[j]
j -= 1
#举个例子[2,3,1],1的位置为2,j就应该是2-1=1,检测到2比1小,赋值[2,3,3],这时候j=j-1,j=0,1与2相比还是小,在挪一下
#[2,2,3],到头了,j=-1,说明碰到最坏的情况了移动到头了,但还好排完顺序了,退出while
arr[j+1] = key
#刚刚是不是到了[2,2,3],把1放进去[1,2,3],搞定一次排序
# 测试数组
arr = [7, 2, 4, 9, 3]
insertion_sort(arr)
print("Sorted array is:", arr)
在这个代码示例中,insertion_sort
函数实现了插入排序算法。它逐一将未排序部分的元素插入到已排序部分的正确位置。
插入排序的时间复杂度
最佳情况 – O(n)
在最佳情况下,即输入数组已经是完全有序的情况下,每个元素无需移动,只需进行一次比较即可确定其位置。
markdownCopy code最佳情况时间复杂度:
- 对于每个元素,仅需进行一次比较。
- 总比较次数 = 1 + 1 + ... + 1 = n 次
- 时间复杂度 = O(n)
平均情况和最坏情况 – O(n^2)
在平均情况或最坏情况(输入数组完全逆序)下,每次插入可能需要在已排序的部分中比较和移动所有元素。
平均情况和最坏情况时间复杂度:
- 第1个元素需要比较1次,第2个元素最多比较2次,...,第n个元素最多比较n次。
- 总比较次数 = 1 + 2 + 3 + ... + n
- 使用等差数列求和公式:总比较次数 = n * (n + 1) / 2 ≈ n^2 / 2
- 时间复杂度 = O(n^2)
插入排序的空间复杂度
插入排序是一种原地排序算法,不需要额外的存储空间,除了输入数组外,它仅需要一个额外的存储空间来暂存当前要插入的元素。
空间复杂度:
- 需要常数级别的额外空间
- 空间复杂度 = O(1)
插入排序的优势
插入排序的劣势
- 效率较低:
- 不适合大规模数据集:
结语
总的来说,插入排序因其简单性和在特定情况下的高效性而受到欢迎,尤其适用于数据量小或部分有序的数据集。然而,由于其在处理大规模数据集时的性能限制,它通常不适用于更复杂的应用场景,其中可能会选择更高效的排序算法。了解插入排序的这些优势和劣势可以帮助开发者在面对不同的排序需求时作出更合适的算法选择。
下一期讲解希尔排序,相当于升级版插入排序
原文地址:https://blog.csdn.net/weixin_53285092/article/details/134645439
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_26332.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!