插入排序是一个<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/sorting-algorithms/">排序算法它生成一个排序的final<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/array">数组(有时称为列表)一次一个元素。虽然排序是一个简单的概念,但它是在复杂的计算机程序(如文件搜索、数据压缩和寻径)中使用的基本原理。在选择排序算法时,运行时间是需要考虑的一个重要因素,因为效率通常与速度有关。插入排序的平均和最坏情况运行时间为 ,所以在大多数情况下,更快的算法是更可取的。
映射下列输入/输出对的算法称为排序算法:
- 输入:一个数组 包含 公开元素定货 .
- 的排序排列 ,被称为 ,这样
这是an的意思<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/arrays/">数组是排序.
一个数组 是当且仅当对所有的 ,
换句话说,排序数组是按特定顺序排列的数组。例如, 是按照字母顺序排列的, 整数列表是否按递增顺序排序,和 是按递减顺序排序的整数列表。
按照惯例,空数组和单例数组(只包含一个元素的数组)总是排序的。这是许多排序算法的基本情况的关键点。
插入排序算法遍历输入数组,每次迭代删除一个元素,找到元素在数组中的位置,然后将其放置在该位置。这个过程从左到右增长一个排序的列表。算法如下:
为每个元素 ,如果 ,交换元素直到 .
下面的动画演示了插入排序:
使用插入排序对下列数组进行排序。
[1]
另一种可视化插入排序的方法是想象一堆扑克牌。
你有牌3,9,6,5,7。编写一个算法或伪代码,按升序排列卡片的值。
基本上,就是运行插入排序 并查找应该插入每个元素的索引。
下面是一些伪代码。[2]
1 2 3 4 5 6 7 8 9for i = 1 to length(A) x = A[i] j = i - 1而j >= 0和A[j] > x A[j+1] = A[j] j = j - 1 end而A[j+1] = x end for
排序的数组是[3,5,6,7,9]。
下面是在Python中实现插入排序的一种方法。还有其他实现算法的方法,但所有实现都源于相同的思想。插入排序可以对任何可排序列表进行排序。
1 2 3 4 5 6 7 8 9definsertion_sort(数组):为槽在范围(1,len(数组)):价值=数组[槽]test_slot=槽-1而test_slot>-1而且数组[test_slot]>价值:数组[test_slot+1]=数组[test_slot]test_slot=test_slot-1数组[test_slot+1]=价值返回数组
上面的Python代码按递增顺序对列表进行排序。你可以做什么单一的改变来让插入排序按递减顺序排序?
在第5行中,将第二个大于号翻转为小于号。第5行应该是:
测试槽位> -1和数组[test slot]<值:#翻转此符号
插入排序运行 时间在最好的情况下流逝 在最糟糕和一般的情况下。
最佳案例分析:
插入排序执行两项操作:它扫描列表,比较每对元素,如果元素顺序不对,则交换元素。每个操作都贡献了算法的运行时间。如果输入数组已经排序,则进行插入排序比较
元素,并且不执行交换(在上面的Python代码中,内部循环从未被触发)。因此,在最好的情况下,插入排序运行
时间。
最差和平均案例分析:
插入排序最糟糕的情况发生在输入列表按递减顺序排列时。要插入最后一个元素,我们最多需要
比较最多
互换。要插入倒数第二个元素,我们最多需要
比较最多
交换等等。[3]因此,执行插入排序所需的操作数为:
.计算<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/recurrence-relations/">递归式对于此算法,使用以下求和:
由此可见,
使用<一个href="//www.parkandroid.com/wiki/master-theorem/" class="wiki_link" title="主定理" target="_blank">主定理求出运行时间的递归式。不出所料,算法的复杂度为
在分析算法时,平均情况通常与最坏情况具有相同的复杂性。插入排序,平均来说
时间。
插入排序具有快速的最佳运行时间,如果输入列表已基本排序,则插入排序是一种很好的排序算法。对于更大或更无序的列表,具有更快的最差和平均情况运行时间的算法,如<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/merge/">归并排序,会是更好的选择。
插入排序是一个稳定排序<一个href="//www.parkandroid.com/wiki/space-complexity/" class="wiki_link" title="空间复杂度" target="_blank">空间复杂度的 .