算法学习:直接插入排序

1、插入排序核心思想

  插入排序的核心思想是将数组中所有的元素和前面已经排序好的元素相比较。

  如果后面选择的元素比排序的元素小,则交换位置,直到比较完成。

2、插入排序过程举例

  arr = [1,22,-1,9,23,5]
  思路,将一个数字插入到有序部分,对比;找到插入位置;插入。
  
  1)将数组分成两部分
    -有序部分 [1]
    -无序部分 [22,-1,9,23,5]
  2)取无序部分的第一个元素插入到有序部分去
    -有序部分 [1,22]
    -无序部分 [-1,9,23,5]
  3)重复步骤2
    -有序部分 [-1,1,22]
    -无序部分 [9,23,5]
  4)重复步骤2
    -有序部分 [-1,1,9,22]
    -无序部分 [23,5]
  5)重复步骤2
    -有序部分 [-1,1,9,22,23]
    -无序部分 [5]
  6)重复步骤2
    -有序部分 [-1,1,5,9,22,23]
    -无序部分 []
 
3、代码
#方法1,从后往前,逐个比较
def insertSort(arr):
    for i in range(1,len(arr)):#若有n个元素,n-1个数需要比较
        for j in range(i,0,-1):#从第i个元素开始,从后往前比较(实际从索引1开始比)
            if arr[j]<arr[j-1]:#如果比前一个数小,交换位置
                arr[j],arr[j-1]=arr[j-1],arr[j]
            else:#否则结束此次循环
                break
    return arr

print(insertSort([1,22,-1,9,23,5])) #[-1, 1, 5, 9, 22, 23]

时间复杂度:O(n^2)

#方法2:
def insertSort02(arr):
    i = 1
    while i<len(arr):#若有n个数字,比较n-1次
        j = i #从索引为1的元素开始比较
        while j>=1:
            if arr[j]<arr[j-1]:#若当前元素比前一个元素小,交换位置
                arr[j],arr[j-1]=arr[j-1],arr[j]
                j-=1 #接下来比较前一个元素
            else:
                break
        i+=1#继续比较下一轮
    return arr
print(insertSort02([1,22,-1,9,23,5])) #[-1, 1, 5, 9, 22, 23]

原文地址:https://www.cnblogs.com/hqq2019-10/p/13933334.html