整理过扑克牌吗?这个排序和你整理扑克牌完全一样!
我们总是挑选一张牌作为基准,然后决定剩下的牌该插到对于这张牌来说哪个合适的位置:
从第二张开始,如果牌比他小,那么第二张牌就插到他的前面,如果比他大,那就先不变
从第三张开始,一次与前面两张比较,如果都比第三张牌大,那之前两张牌总是要往后捣腾位置,然后把这张牌插到空出来的那个位置上。
插入排序的外层循环:for i in range(1, n)
表示要一共要整理的元素,从第二个元素开始,因为我们总是取第一个数作为参照
保存现场
当前整理到的数,我们要把这个数所有的信息保存起来,下标和值,都要作为内层循环的参照
- 下标决定了前面已经排好序的元素一直往后捣腾,知道找到一个小于这个元素的值停止
- 在他之前的每个元素都要进行比较,表示在这个数之前的元素什么时候要往后捣腾
最后捣腾完了(内层循环结束),把这个抽出来的元素插入到捣腾后空出来的位置
def insertionSort(nums): n = len(nums) for i in range(1,n): cur = nums[i] position = i while position > 0 and nums[position - 1] > cur: nums[position] = nums[position - 1] position = position - 1 nums[position] = cur return nums if __name__ == "__main__": numbers = [3, 7, 5, 4, 8, 9, 6, 2, 1] print(insertionSort(numbers))
时间复杂度:O(n2)
插入排序也有一个最好的情况:当所有的元素已经从小到大排好序之后,只需要完成一次遍历整个列表就可以了,并不需要移动元素的位置
空间复杂度:O(1)