算法初步-排序算法-插入排序

插入排序的原理

        直观地讲,插入排序算法是把给定数组中的元素依次插入到一个新的数组中,最终得到一个完整的有序数组。

        插入排序的平均时间复杂度是O(n^2),最好情况下的时间复杂度是O(n),最坏情况下的时间复杂度是O(n^2)。它的空间复杂度是O(1)。

        插入排序是一个稳定的排序算法。这里涉及一个新的概念:排序算法的稳定性

        排序算法可以分为稳定的算法和不稳定的算法两类。在一个数组中,我们假设存在多个有相同关键字的元素。如果使用算法进行排序后,这些具有相同关键字的元素相对顺序一定保持不变,那么我们称这个排序算法为稳定的排序算法。冒泡排序、插入排序和归并排序等都是稳定的排序算法。而不能保证这些元素排序前后的相对位置相同的算法,就是不稳定的排序算法。选择排序、希尔排序和快速排序等都是不稳定的排序算法。

        直接插入排序的实现过程较为直观。排序开始时,对范例数组的每一个元素进行遍历。如图2-1所示,虚线的左侧表示已经有序的元素,右侧表示待排序的元素。

算法初步-排序算法-插入排序_第1张图片

图1

①初始状态下,所有的元素都处于无序的状态,所以它们都在虚线的右侧。

②首先遍历的是第一个元素,这时候有序的数组为空(暂且把整个数组在虚线左侧的部分考虑成一个整体),所以第一个元素插入左侧的数组后必定是有序的。

③第一个元素插入完成后,接下来遍历的是整个数组中的第二个元素。

④此时,我们就要考虑:如何使左侧有序的数组在新元素插入后保持有序?答案是再遍历一遍左侧有序的数组,找到正确的位置再插入新的元素。如图2所示,第二个元素3比有序数组中的5小,所以应该把它插入到5的左侧。算法初步-排序算法-插入排序_第2张图片
 图2

⑤如图3所示,随后的过程是相似的。依次遍历无序数组中的元素,并把它们插入到有序数组中正确的位置。

⑥当对无序数组的遍历完成后,有序数组中就包含了所有原始数组中的元素。这时候对原始数组的排序就完成了。

插入排序的代码实现

nums=[1,2,3,5,1,2,3]
for i in range(1,len(nums)):
    for j in range(i):
        if(nums[j]>nums[i]):
            ins =nums[i]
            nums.pop(i)
            nums.insert(j,ins)
            break
print(nums)

你可能感兴趣的:(算法分析与设计,排序算法)