例子:元组--三数比较大小解法及冒泡法

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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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次方)
原文地址:https://www.cnblogs.com/linfengs/p/11714595.html