舞动算法:插入排序

插入排序原理

  • 从第二个元素开始和前面的元素进行比较,如果前面的元素比当前元素大,则将前面元素 后移,当前元素依次往前,直到找到比它小或等于它的元素插入在其后面。

  • 然后选择第三个元素,重复上述操作,直到最后一个元素。

 

插入排序特点

时间复杂度:插入排序同样需要两次循坏一个一个比较,故时间复杂度也为O(n^2)

空间复杂度:只需要常数个辅助单元,所以空间复杂度也为O(1)

 

不明白?跳个舞吧【https://www.bilibili.com/video/BV1xW411Y73Z?t=95

 

def insertion_sort(arr):
    # 获取列表长度
    length = len(arr)

    # 从第二个元素开始,即下标为 1 的元素,进行比较
    for i in range(1, length):
        # 将当前值作为一个临时变量存储,用于值的比较交换
        temp = arr[i]
        # 获得当前值的前一个元素的下标
        pre_index = i - 1

        # 判断前一个元素是否存在,并将它和当前值进行大小比较
        while pre_index >= 0 and arr[pre_index] > temp:
            # 前一个元素值 大于 当前值时
            # 将该前一个元素值,向后移一位,进行值的覆盖
            arr[pre_index + 1] = arr[pre_index]

            # 向前,再获取下一个元素的下标
            pre_index -= 1
        # 当前一个元素值 小于 temp这个比较值时,temp会插入在这个元素值后面
        arr[pre_index + 1] = temp

    return arr


def insertion_sort2(arr):
    # 获取列表长度
    length = len(arr)

    for i in range(1, length):
        # 设置当前值前一个元素的标识
        j = i - 1

        # 如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
        if arr[i] < arr[j]:
            temp = arr[i]
            arr[i] = arr[j]

            # 继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
            j = j-1
            while j >= 0 and arr[j] > temp:
                arr[j + 1] = arr[j]
                j = j-1

            # 将临时变量赋值给合适位置
            arr[j + 1] = temp

    return arr


list_1 = [5, 3, 4, 2, 1]
print(insertion_sort2(list_1))

 

posted @ 2020-09-06 14:16  颗粒成仓  阅读(207)  评论(0编辑  收藏  举报