1.最基础的解法:if--elif--else
1 while True: 2 a = int(input("The first num: ")) 3 b = int(input("The second num: ")) 4 c = int(input("The third num: ")) 5 if a > b: 6 if b > c: 7 print(a,b,c) 8 elif a > c: 9 print(a,c,b) 10 else: 11 print(c,a,b) 12 else: 13 if a > c: 14 print(b,a,c) 15 elif b > c: 16 print(b,c,a) 17 else: 18 print(c,b,a) 19 ################################################# 20 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/teryer.py 21 The first num: 3 22 The second num: 1 23 The third num: 2 24 3 2 1 25 The first num: 1 26 The second num: 3 27 The third num: 2 28 3 2 1
2.列表与最大值最小值方法:
1 nums = [] 2 # 定义一个空列表 3 for i in range(1,4): 4 # 3个数循环三次 5 nums.append(int(input('请输入第{}个数字: '.format(i)))) 6 # 往空列表nums里面逐个添加数字 7 while True: 8 max_num = max(nums) 9 # 从列表nums里面选取最大值 10 print(max_num,end=' ') 11 # 输出该最大值 12 nums.remove(max_num) 13 # 移除该最大值 14 # 进行剩余数值进行最大值的选取,并继续移除最大值,直到剩下最后一个元素 15 if len(nums) == 1: 16 print(nums[0],end=' ') 17 break 18 # 如果列表长度为1,即列表还有一个元素的时候,跳出while True循环 19 ################################################## 20 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/teryer.py 21 请输入第1个数字: 32 22 请输入第2个数字: 5 23 请输入第3个数字: 11 24 32 11 5 25 Process finished with exit code 0 26 # 该方法可以进行多个数字的排序
3.列表排序sort()方法:
1 # coding=gbk 2 nums = [] 3 # 创建一个空列表 4 for i in range(1,4): 5 # 进行3次循环 6 nums.append(int(input('请输入第{}个数字: '.format(i)))) 7 nums.sort(reverse=True) 8 # 列表的sort()方法,reverse=True为降序排列,默认升序排列 9 print(nums) 10 ################################################ 11 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/teryer.py 12 请输入第1个数字: 21 13 请输入第2个数字: 33 14 请输入第3个数字: 1 15 [33, 21, 1] 16 17 Process finished with exit code 0
18 # 该方法可以进行多个数字的排
4.冒泡法
- 属于交换排序
- 两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒
- 结果分为升序和降序排列
- 升序:n个数从左至右,编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧。直至n-2和n-1比较完,第一轮比较完成。第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。依次类推,每一轮都会减少最右侧的不参与比较,直至剩下最后2个数比较。
- 降序:与升序相反
1 nums = [1,9,8,5,6,7,4,3,2] 2 # 创建一个列表 3 length = len(nums) 4 # 计算该列表的长度 5 count_swap = 0 6 # 交换次数 7 count = 0 8 # 迭代次数 9 for i in range(length): 10 # 有几个元素就循环对比几次 11 for j in range(length-i-1): 12 # 每循环完一次就固定一个最大数在右侧,剩下的数就循环对比length-i次 13 # -1是边界问题,因为下面的边界有j+1 14 count += 1 15 if nums[j] > nums[j+1]: 16 tmp = nums[j] 17 nums[j] = nums[j+1] 18 nums[j+1] = tmp 19 # 冒泡的核心思想,最值交换 20 count_swap += 1 21 print(nums,count_swap,count) 22 ################################################## 23 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/teryer.py 24 [1, 2, 3, 4, 5, 6, 7, 8, 9] 25 36 25 26 Process finished with exit code 0
试想一下,如果给出的nums是[1,2,3,4,5,6,7,8,9]这样的列表,15~18行代码就完全没有执行,即没有交换次数,count_swap的值为0,但是迭代次数count和第一个nums列表一样,一次都没有少,依旧需要,1和2取最大值2和3作比较,2和3取最大值3和4作比较……count=36,有没有什么办法可以缩减这种作比较的次数呢?我们可以打一个标签flag,如下述代码,count=8,效率提高了很多。
1 # coding=gbk 2 nums = [1,2,3,4,5,6,7,8,9] 3 length = len(nums) 4 count_swap = 0 5 count = 0 6 flag = False 7 # 设置一个标签flag,初始值为Flase 8 for i in range(length): 9 flag = False 10 # 每次i循环都重制flag的值,nums=[1,2,3,4,9,6,7,8,5]的时候看的明显 11 for j in range(length-i-1): 12 count += 1 13 if nums[j] > nums[j+1]: 14 tmp = nums[j] 15 nums[j] = nums[j+1] 16 nums[j+1] = tmp 17 flag = True 18 # 在这里的意思是,如果有交换的元素,flag的值变为True 19 count_swap += 1 20 if not flag: 21 break 22 # 这两行代码的意思是如果没有元素做交换,那么跳出j的for循环 23 print(nums,count_swap,count) 24 ############################################## 25 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/teryer.py 26 [1, 2, 3, 4, 5, 6, 7, 8, 9] 0 8 27 28 Process finished with exit code
冒泡法的总结:
- 冒泡法需要数据一轮轮比较
- 可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交換,继续下一轮排序
- 最差的排序情况是,初始顺序与目标顺序完全相反遍历次数1, ... ,n-1之和n(n-1)/2
- 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
- 时间复杂度O(n的2次方)