插入排序是A.<一种target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/sorting-algorithms/">排序算法这是一个最终排序的<一种target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/array">大批(有时被称为列表)一次一个元素。在排序中是一个简单的概念,它是在复杂的计算机程序中使用的基本原理,例如文件搜索,数据压缩和路径查找。运行时间是选择排序算法时要考虑的重要措施,因为效率通常在速度方面被认为。插入排序具有平均和最坏情况的运行时间 因此,在大多数情况下,更加理想的算法。
映射以下输入/输出对的算法称为a排序算法:
- 输入:数组 那个包含 可订购的元素 。
- 输出:排列排列 ,叫 ,这样
这是它的意思<一种target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/arrays/">大批成为分类。
数组 如果且仅当所有人时,是分类的 那
换句话说,排序阵列是以特定顺序的数组。例如, 按字母顺序排序, 是按越来越顺序排序的整数列表,以及 是按递减顺序排序的整数列表。
按照惯例,始终对空数组和单例阵列(仅由一个元素组成的数组)。这是许多分类算法的基本情况的关键点。
插入排序算法通过输入数组迭代并删除每个迭代的一个元素,找到元素属于数组中的位置,然后将其放置在那里。此过程从左到右增长排序列表。该算法如下:
对于每个元素 , 如果 ,转换元素直到 。
下面的动画说明了Insertion排序:
使用Insertion排序对以下数组进行排序。
[1]
可视化插入排序的另一种方法是想到一堆扑克牌。
您有卡片3,9,6,5和7.编写算法或伪代码,以按升序排列卡的值。
基本上,这个想法是运行插入排序 时间并找到应插入每个元素的索引。
这是一些伪代码。[2]
1 2 3 4 5 6 7 8 9对于i = 1到长度(a)x = a [i] j = i - 1,而j> = 0和a [j]> x a [j + 1] = a [j] j = j - 1结束a [j + 1] = x结束
排序阵列是[3,5,6,7,9]。
以下是在Python中实现插入的一种方法。还有其他方法来实现算法,但所有实现都源于同一思想。插入排序可以对任何可订购的列表进行排序。
1 2 3 4 5 6 7 8 9def插入_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和阵列[测试插槽]<价值:#flip这个标志
插入排序运行 时间在最好的案例中并贯穿 在最糟糕和平均的情况下。
最佳案例分析:
插入排序执行两个操作:它通过列表扫描,比较每对元素,如果它们脱气,则会递送元素。每个操作都有助于算法的运行时间。如果输入阵列已按排序顺序,则插入排序比较
元素并执行无次交换(在上面的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">空间复杂性的 。