【算法导论-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′>,满足a1′≤a2′≤⋅⋅⋅≤an′。
插入排序简介:
插入排序的工作方式像许多人排序一手扑克牌。
开始时,我们的左手为空并且桌子上的牌面朝下
我们每次从桌子上拿走一张牌并将它插入左手中正确的位置
为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较
插入排序的过程图示如下:
算法实现:
- 定义一个数组,给出随机的数字;这个是需要我们排序的乱序数组
- 从数组的第二个数字开始(索引为1),依次和前一个数字到第一个数字开始比较
- 如果前一个数字较大则交换两个数,否则数字顺序不变
尝试编写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-1 | 2+3+4+…+n = (n*n+n-2)/2 |
移动次数 | 0 | 1+2+3+…+(n-1) = n*n/2 |