前言
本文讲述python实现选择排序、冒泡排序、插入排序以及实例应用。后续还会有新的排序算法实现及实例应用。
一、选择排序
所谓的选择排序就是反复从未排序的序列中,取出最大或者最小元素插入到新的数列里,最终形成一个有序得序列。选择排序有两类分别为递增排序和递减排序。
- 递增排序:每次选择未排序序列中最小的,与未排序数列的第一个值进行交换。
- 递减排序:每次选择未排序序列中最大的,与未排序数列的第一个值进行交换。
(1)代码看排序过程
data = [56,18,49,84,72]
def choose_high(data):
for i in range(len(data)-1):#遍历列表
for j in range(i+1,len(data)):#每一次从上一次排好的后面扫描
if data[i] > data[j]:#递增排序,小的放前面;递减排序只需要把大于换成小于
data[i],data[j] = data[j],data[i]
print("第",i+1,"次排序的结果:",end="")
for i in data:
print("%3d"%i,end="")
print("")
print("递增排序:")
print("排序之前的序列为:",end="")
for i in data:
print("%3d"%i,end="")
print("\n================================")
print("排序过程如下:")
choose_high(data)
print("================================")
print("排序之后的序列为:",end="")
for i in data:
print("%3d"%i,end="")
运行结果:
递增排序:
排序之前的序列为: 56 18 49 84 72
================================
排序过程如下:
第 1 次排序的结果: 18 56 49 84 72
第 2 次排序的结果: 18 49 56 84 72
第 3 次排序的结果: 18 49 56 84 72
第 4 次排序的结果: 18 49 56 72 84
================================
排序之后的序列为: 18 49 56 72 84
Process finished with exit code 0
(2)代码的实例应用
# 给下列成绩从大到小排序
dic = {"haha":90,"xixi":100,"koko":80,"niki":75,"baby":88}
# 定义一个函数,表示按照成绩从大到小排序
def key(x):
return x[1]
def choose_low(data:list,key):
for i in range(len(data)-1):
for j in range(i+1,len(data)):
if (key(data[i])<key(data[j])):
data[i],data[j] = data[j],data[i]
return data
dic_item = list(dic.items())#必须转化成列表
print("排序前:")
for i in range(len(dic_item)):
print(dic_item[i])
print("排序后:")
after_sort = choose_low(dic_item,key)
for index,info in enumerate(after_sort):
print("第",index+1,"名",info)
运行结果:
排序前:
('haha', 90)
('xixi', 100)
('koko', 80)
('niki', 75)
('baby', 88)
排序后:
第 1 名 ('xixi', 100)
第 2 名 ('haha', 90)
第 3 名 ('baby', 88)
第 4 名 ('koko', 80)
第 5 名 ('niki', 75)
Process finished with exit code 0
二、冒泡排序
冒泡排序的思想是从第一个数开始,一次比较相邻的两个数的大小,将其从小到大或者从大到小排列。
(1)代码看排序过程
data = [56,20,84,66,13]
def bubles(data):
i = len(data)-1 #控制要排序的次数,排序次数为排序个数减一
while (i>0):
for j in range(i):
if data[j]>data[j+1]:
data[j],data[j+1] = data[j+1],data[j]
print("第%d排序过程为:"%(len(data)-i), end="")
i -= 1
for k in data:
print("%3d"%k,end="")
print("")
print("冒泡排序前:",end="")
for i in data:
print("%3d"%i,end="")
print("\n==========================")
print("开始冒泡排序……")
bubles(data)
print("============================")
print("冒泡排序后:",end="")
for i in data:
print("%3d"%i,end="")
运行结果:
冒泡排序前: 56 20 84 66 13
==========================
开始冒泡排序……
第1排序过程为: 20 56 66 13 84
第2排序过程为: 20 56 13 66 84
第3排序过程为: 20 13 56 66 84
第4排序过程为: 13 20 56 66 84
============================
冒泡排序后: 13 20 56 66 84
Process finished with exit code 0
(2)代码的实例运用
data = {"王一博":98,"张彬彬":100,"吴磊":97,"杨洋":99}
def key(x):
return x[1]
def bubles(data:list,key):
i = len(data)-1 #控制要排序的次数,排序次数为排序个数减一
while (i>0):
for j in range(i):
if key(data[j])<key(data[j+1]):
data[j],data[j+1] = data[j+1],data[j]
print("第%d排序过程为:"%(len(data)-i), end="")
i -= 1
for k in data:
print(k,end="")
print("")
data2 = list(data.items())
print("冒泡排序前:",end="")
for i in data2:
print(i,end="")
print("\n==============================================================")
print("开始冒泡排序……")
bubles(data2,key)
print("==============================================================")
print("冒泡排序后:")
for index,info in enumerate(data2):
print("第",index+1,"名:",info)
运行结果:
冒泡排序前:('王一博', 98)('张彬彬', 100)('吴磊', 97)('杨洋', 99)
==============================================================
开始冒泡排序……
第1排序过程为:('张彬彬', 100)('王一博', 98)('杨洋', 99)('吴磊', 97)
第2排序过程为:('张彬彬', 100)('杨洋', 99)('王一博', 98)('吴磊', 97)
第3排序过程为:('张彬彬', 100)('杨洋', 99)('王一博', 98)('吴磊', 97)
==============================================================
冒泡排序后:
第 1 名: ('张彬彬', 100)
第 2 名: ('杨洋', 99)
第 3 名: ('王一博', 98)
第 4 名: ('吴磊', 97)
Process finished with exit code 0
三、插入排序
插入排序的算法思想是将数列中的元素逐一与排序好的元素比较,进而找到合适的位置插入。
(1)代码看排序过程
data = [58,29,86,69,10]
def insert(data):#从小到大插入排序
for i in range(len(data)):
temp = data[i]
j = i-1#已排好序的最后一个
while(j>=0 and temp<data[j]):#如果要插入的比排好序的最后一个小
data[j+1]=data[j]#原来的元素后移一位
j = j-1
data[j+1] = temp
print("第", i + 1, "次排序的结果:", end="")
for k in data:
print("%3d"%k,end="")
print("")
print("插入排序:")
print("排序之前的序列为:",end="")
for i in data:
print("%3d"%i,end="")
print("\n================================")
print("排序过程如下:")
insert(data)
print("================================")
print("排序之后的序列为:",end="")
for i in data:
print("%3d"%i,end="")
运行结果:
插入排序:
排序之前的序列为: 58 29 86 69 10
================================
排序过程如下:
第 1 次排序的结果: 58 29 86 69 10
第 2 次排序的结果: 29 58 86 69 10
第 3 次排序的结果: 29 58 86 69 10
第 4 次排序的结果: 29 58 69 86 10
第 5 次排序的结果: 10 29 58 69 86
================================
排序之后的序列为: 10 29 58 69 86
Process finished with exit code 0
(2)代码的实例运用
# 我心目中的美丽女明星颜值打分如下:
data = {"迪丽热巴":99,"赵丽颖":97,"唐诗逸":100,"白鹿":96}
def key(x):
return x[1]
def insert(data:list,key):#从大到小排序
for i in range(len(data)):
temp = data[i]
j = i - 1#上一次排好序的最后一个
while (j>=0 and key(temp)>key(data[j])):#如果要插入的比上一次最后还要大
data[j+1] = data[j]
j = j - 1
data[j+1] = temp
print("第",i+1,"次排序结果:",end="")
print(data)
data2 = list(data.items())
print("插入排序前:",end="")
for i in data2:
print(i,end="")
print("\n===========================================================================")
print("开始插入排序……")
insert(data2,key)
print("===========================================================================")
print("插入排序后:")
for index,info in enumerate(data2):
print("第",index+1,"名:",info)
运行结果:
插入排序前:('迪丽热巴', 99)('赵丽颖', 97)('唐诗逸', 100)('白鹿', 96)
===========================================================================
开始插入排序……
第 1 次排序结果:[('迪丽热巴', 99), ('赵丽颖', 97), ('唐诗逸', 100), ('白鹿', 96)]
第 2 次排序结果:[('迪丽热巴', 99), ('赵丽颖', 97), ('唐诗逸', 100), ('白鹿', 96)]
第 3 次排序结果:[('唐诗逸', 100), ('迪丽热巴', 99), ('赵丽颖', 97), ('白鹿', 96)]
第 4 次排序结果:[('唐诗逸', 100), ('迪丽热巴', 99), ('赵丽颖', 97), ('白鹿', 96)]
===========================================================================
插入排序后:
第 1 名: ('唐诗逸', 100)
第 2 名: ('迪丽热巴', 99)
第 3 名: ('赵丽颖', 97)
第 4 名: ('白鹿', 96)
Process finished with exit code 0
总结
无论是选择排序、冒泡排序还是插入排序,这三种排序的时间复杂度都是
选择排序是每一次在未排序的序列里面,选择最大或者最小的元素,放在未排序的序列第一位。
冒泡排序是需要有一个外层循环控制排序的次数,内层循环实现相邻的两个数据比较,实现从大到小或者从小到大排序。排序的次数为需要排序元素的个数减一。
插入排序是默认第一次排序确定第一个元素的位置,然后遍历未排序的序列,每一次将为排序的序列插入到合适的位置。算法中设置了一个指针指向上一次排好序的元素,然后将待排序的元素与其比较,将其插入到合适的位置。