插入排序 python实现

插入排序

python实现

原理

逐个元素排查,第一个元素默认已排序,从第二个元素开始,比较当前元素与前一个元素的大小,前一个元素大于当前元素,则交换两个元素位置,交换后再用已经交换到前一个位置的当前元素与现位置的前一个元素比较,直到无需交换,进入下一个元素,以此类推,遍历完所有位置的元素。

运行时间

最坏:原数组完全逆序

 Ω(n^2)

最好:原数组已基本排序或完全排序

 O(n)

实现

精简

import copy
import time

# 插入排序法
def insert_func(obj):
    """
    排序中不写入当前值,每轮最后写入
    """
    for i in range(1, len(obj)):
        current = obj[i]
        j = i
        while j > 0 and obj[j - 1] > current:
            obj[j] = obj[j - 1]
            j -= 1
        obj[j] = current

加打印版

import copy
import time

# 插入排序法
def insert1(obj):
    """
    排序中不写入当前值,每轮最后写入
    :param obj: 未排序数组
    :return: obj: 排序后数组
    """
    t1 = time.time()
    print("未排序之前数组:{}".format(obj))
    for i in range(1, len(obj)):
        current = obj[i]
        print("当前排序数:{}".format(current))
        j = i
        while j > 0 and obj[j - 1] > current:
            obj[j] = obj[j - 1]
            print("本轮排序中:{}".format(obj))
            j -= 1
        obj[j] = current
        print("本轮排序完:{}".format(obj))
    print("最终排序结果:{}".format(obj))
    t2 = time.time()
    print("time:%s" % (t2-t1))

    return obj


def insert2(obj):
    """
    排序中直接与前一位交换,在前一位写入当前值
    :param obj: 未排序数组
    :return: obj: 排序后数组
    """
    t1 = time.time()
    print("未排序之前数组:{}".format(obj))
    for i in range(1, len(obj)):
        print("当前排序数:{}".format(obj[i]))
        j = i
        while j > 0 and obj[j - 1] > obj[j]:
            obj[j], obj[j - 1] = obj[j - 1], obj[j]
            print("本轮排序中:{}".format(obj))
            j -= 1
        print("本轮排序完:{}".format(obj))
    print("最终排序结果:{}".format(obj))
    t2 = time.time()
    print("time:%s" % (t2-t1))

    return obj

if __name__ == '__main__':
    li = [3, 1, 4, 7, 2, 8, 6, 5]
    lii = copy.deepcopy(li)
    insert1(li)
    print("*"*20)
    insert2(lii)

倒序排序

将>换为<

def insert_func(obj):
    """
    排序中不写入当前值,每轮最后写入
    """
    for i in range(1, len(obj)):
        current = obj[i]
        j = i
        while j > 0 and obj[j - 1] < current:
            obj[j] = obj[j - 1]
            j -= 1
        obj[j] = current
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值