入坑后的算法初学:用Python实现插入排序

入坑后的算法初学:用Python实现插入排序

参考书籍:《我的第一本算法书》

实现语言:Python

一:算法步骤描述

(1)得到一个任意排序任意长度大小的数字序列,假设将它分为已被排序过的"有序区间"和未被排序过的"待排序区间"。

(2)将"待排序区间"的数字依次和"有序区间"的数字进行比较,找到一个适合自己插入的位置坐下。

(3)待所有的数都进入"有序区间"后,排序结束。

二:图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二:代码块
'''
        插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据
    陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内
    取出一个数据,然后将它插入到已排序区域内合适的位置上。
'''


def charu(num_list):
    for i in range(1, len(num_list)):
        ''' 
            i的取值范围是待比较区间的索引[i,num_list的长度)
            j的取值范围是有序区间的索引  [0,i)
            (1)第一层for循环表示循环待排序区间,每一次循环表示比较完一轮,有序区间就会多一个数,无序区间也会少一个数
            (2)第一轮默认是排序过的,所以左边第一个数表示已经进入有序区间,待排序区间[1,数组长度)=> i,有序区间[0,0]=> j
            (3)第二层for循环表示无序区间中从左边开始数的第一个数依次和有序区间进行比较(从有序区间右边开始),直到找到一个合
           	适自己的位置然后插入
            (4)直到所有的数都进入了有序区间,排序停止
        '''
        print("第{}轮比较".format(i))
        '''
            第二层for循环的循环体是为了实现:将正在寻找位置的"无序区间数字"从有序区间的从右往左开始比较 [1,3,4,5] <= 2
        '''
        for j in range(i - 1, -1, -1):
            if num_list[j + 1] < num_list[j]:  # 判断是否需要交换位置
                num_list[j + 1], num_list[j] = num_list[j], num_list[j + 1]
                if num_list[j] >= num_list[j - 1] or j == 0:  
                # 判断是否找到合适自己的位置,找到了就停止这一轮的比较,j = 0表示前面已经没有数可以比了,你就是最小的!
                    break
            else:
                break
        print(num_list)
    return num_list


charu([4, 3, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1])
三:输出效果
1轮比较
[3, 4, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]2轮比较
[3, 4, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]3轮比较
[3, 3, 4, 7, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]4轮比较
[3, 3, 4, 7, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]5轮比较
[3, 3, 4, 5, 7, 8, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]6轮比较
[3, 3, 4, 5, 6, 7, 8, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]7轮比较
[2, 3, 3, 4, 5, 6, 7, 8, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]8轮比较
[2, 3, 3, 4, 5, 6, 7, 8, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]9轮比较
[2, 2, 3, 3, 4, 5, 6, 7, 8, 25, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]10轮比较
[2, 2, 3, 3, 4, 5, 6, 7, 8, 25, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]11轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 25, 67, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]12轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 25, 67, 7, 13, 51, 35, 23, 76, 4, 23, 1]13轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 25, 67, 13, 51, 35, 23, 76, 4, 23, 1]14轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 67, 51, 35, 23, 76, 4, 23, 1]15轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 51, 67, 35, 23, 76, 4, 23, 1]16轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 35, 51, 67, 23, 76, 4, 23, 1]17轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 4, 23, 1]18轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 4, 23, 1]19轮比较
[2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 23, 1]20轮比较
[2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 23, 25, 35, 51, 67, 76, 1]21轮比较
[1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 23, 25, 35, 51, 67, 76]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值