Python实现插入排序

python 实现 插入排序

插入排序原理:

通过构建有序序列,对于未排序数据,
在已排序序列中从后向前扫描,找到相应位置并插入
*

例如对列表 L = [2, 22, 12, 56, 78, 60] 进行排序
开始排序时,我们先把列表的第一个元素 2 设为有序序列SortedList,剩下的元素设置为未排序数据UnsortedList
第一轮:我们从UnsortedList中取出第一个元素 22,将它与SortedList中的元素 2 进行比较;由于22 大于 2,故不变,
此时SortedList 变为了 [2, 22],UnsortedList 变为 [12, 56, 78, 60]
对于 L 来说就是:
[2, 22, 12, 56, 78, 60]
第二轮:我们从UnsortedList中取出第一个元素 12,将它与SortedList中的元素 22 进行比较;由于22 大于 12,故两者交换;然后12再跟 2 比较,由于12 大于 2 ,故不变,此时SortedList 变为了 [2, 12, 22],UnsortedList 变为 [56, 78, 60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第三轮:我们从UnsortedList中取出第一个元素 56,将它与SortedList中的元素 22 进行比较;由于56大于 22,故不变;然后56再跟 12 比较,由于56 大于 12 ,故不变,又由于56 大于 2 ,故不变,此时SortedList 变为了 [2, 12, 22, 56],UnsortedList 变为 [78, 60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第四轮:我们从UnsortedList中取出第一个元素 78,将它与SortedList中的元素 56 进行比较;由于78大于 56,故不变;依次同理跟SortedList 中的元素比较,78小于SortedList的元素 就交换,反之不变;此时SortedList 变为了 [2, 12, 22, 56,78],UnsortedList 变为 [60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第五轮:我们从UnsortedList中取出第一个元素 60,将它与SortedList中的元素 78 进行比较;由于78大于 60,故交换;依次同理跟SortedList 中的元素比较,60小于SortedList的元素 就交换,反之不变;此时SortedList 变为了 [2, 12, 22, 56,78, 60],UnsortedList就没有元素,此时排序也结束了。
对于 L 来说就是:
[2, 12, 22, 56, 60, 78]

一共进行 len(L) - 1 轮比较。
第一轮: [2, 22, 12, 56, 78, 60]
第二轮: [2, 12, 22, 56, 78, 60]
第三轮: [2, 12, 22, 56, 78, 60]
第四轮: [2, 12, 22, 56, 78, 60]
第五轮: [2, 12, 22, 56, 60, 78]

代码实现如下:

class InsertSort():
    def __init__(self, lyst):
        self.list = lyst

    def Sorted(self):
        for i in range(1, len(self.list)):
            preIndex = i - 1
            current = self.list[i]
            while preIndex >= 0 and self.list[preIndex] > current:
                self.list[preIndex+1] = self.list[preIndex]
                preIndex -= 1
        	self.list[preIndex+1] = current
        return self.list


if __name__ == "__main__":
    print('---------- Test ------------')
    l = [212, 358, 6, 5, 2, 65, 12, 1, 48, 37]
    print(f'原数组为{l}')
    Is = InsertSort(l)
    l_new = Is.Sorted()
    print(f'经过插入排序后的数组为:\n{l_new}')

插入算法,最坏情况下的时间复杂度为O(n²)
空间复杂度为:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值