【学习笔记|算法导论-2.1】插入排序

【算法导论-2.1】插入排序

考虑下面的排序问题:

输入: n 个 数 的 一 个 序 列 < a 1 , a 2 , ⋅ ⋅ ⋅ , a n > 。 n个数的一个序列<a_1,a_2,\cdot\cdot\cdot ,a_n>。 n<a1,a2,,an>

输出: 输 入 序 列 的 一 个 排 列 < a 1 ′ , a 2 ′ , ⋅ ⋅ ⋅ , a n ′ > , 满 足 a 1 ′ ≤ a 2 ′ ≤ ⋅ ⋅ ⋅ ≤ a n ′ 。 输入序列的一个排列<a_1',a_2',\cdot\cdot\cdot,a_n'>,满足a_1'\le a_2' \le \cdot\cdot\cdot \le a_n'。 <a1,a2,,an>,a1a2an

插入排序简介:

插入排序的工作方式像许多人排序一手扑克牌。

开始时,我们的左手为空并且桌子上的牌面朝下

我们每次从桌子上拿走一张牌并将它插入左手中正确的位置

为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较

插入排序的过程图示如下:
在这里插入图片描述

算法实现:

  1. 定义一个数组,给出随机的数字;这个是需要我们排序的乱序数组
  2. 从数组的第二个数字开始(索引为1),依次和前一个数字到第一个数字开始比较
  3. 如果前一个数字较大则交换两个数,否则数字顺序不变

尝试编写python代码:

1、定义一个数组,给出随机的数字:

#!/usr/bin/env python3
# coding=utf-8

import random
# 定义list A,保存需要我们排序的数字,通过随机数的方式产生随机数组
def createlist():
    A = []
    len = int(input('请输入随机数组长度:'))
    for i in range(0,len):
        A.append(random.randint(1,100))
    print(A)

createlist()
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:10
[26, 32, 87, 63, 39, 48, 46, 83, 100, 73]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:20
[90, 25, 12, 78, 78, 62, 65, 12, 69, 22, 70, 96, 99, 76, 61, 62, 51, 20, 15, 64]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:15
[86, 73, 25, 61, 36, 51, 56, 70, 5, 65, 53, 7, 12, 73, 25]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:15
[19, 53, 1, 94, 75, 42, 39, 27, 67, 23, 29, 9, 95, 42, 62]
(base) [root@theThree 2]#

2、对数组进行排序

def insertsort():
    A = createlist()            # 生产随机列表A
    print(A)                    
    for i in range(1,len(A)):   # 从第二个数开始一次和前面的比较
        while i>0:              # i 不能等于0,否则A[i-1]是和最后一个数比较了
            if A[i] > A[i-1]:   # 如果数字比前面的大则不变
                i -=1
            else:               # 否则交换二者位置
                A[i],A[i-1] = A[i-1],A[i]
                i -= 1          # 比较完成后i-1,和更前面的数字进行比较(如果还有数字的话)
    print(A)
insertsort()

3、整体代码及执行结果:

(base) [root@theThree 2]# cat insertsort.py
#!/usr/bin/env python3
# coding=utf-8

import random
# 定义list A,保存需要我们排序的数字,通过随机数的方式产生随机数组
def createlist():
    A = []
    lens = int(input('请输入随机数组长度:'))
    for i in range(0,lens):
        A.append(random.randint(1,100))
    return A

def insertsort():
    A = createlist()            # 生产随机列表A
    print(A)                    
    for i in range(1,len(A)):   # 从第二个数开始一次和前面的比较
        while i>0:              # i 不能等于0,否则A[i-1]是和最后一个数比较了
            if A[i] > A[i-1]:   # 如果数字比前面的大则不变
                i -=1
            else:               # 否则交换二者位置
                A[i],A[i-1] = A[i-1],A[i]
                i -= 1          # 比较完成后i-1,和更前面的数字进行比较(如果还有数字的话)
    print(A)
insertsort()
(base) [root@theThree 2]#
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:12
[91, 76, 86, 52, 14, 29, 49, 89, 47, 85, 33, 74]
[14, 29, 33, 47, 49, 52, 74, 76, 85, 86, 89, 91]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:12
[92, 77, 64, 40, 64, 79, 62, 23, 33, 14, 94, 47]
[14, 23, 33, 40, 47, 62, 64, 64, 77, 79, 92, 94]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:16
[35, 88, 35, 38, 82, 12, 42, 76, 60, 93, 100, 5, 89, 12, 62, 41]
[5, 12, 12, 35, 35, 38, 41, 42, 60, 62, 76, 82, 88, 89, 93, 100]
(base) [root@theThree 2]# python insertsort.py
请输入随机数组长度:16
[42, 40, 74, 73, 56, 2, 90, 13, 92, 84, 98, 34, 74, 14, 99, 30]
[2, 13, 14, 30, 34, 40, 42, 56, 73, 74, 74, 84, 90, 92, 98, 99]
(base) [root@theThree 2]#

算法复杂度分析():

比较项目最好情况最坏情况
比较次数n-12+3+4+…+n = (n*n+n-2)/2
移动次数01+2+3+…+(n-1) = n*n/2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值