zoukankan      html  css  js  c++  java
  • 例子:元组--三数比较大小解法及冒泡法

    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次方)
  • 相关阅读:
    Java正则表达式教程
    神奇3D圣诞树祝广大技术人员圣诞快乐!
    SQL语句:Group By总结
    最全面的笔记本基本硬件参数介绍
    已安装的Flash Player不支持FlexBuilder调试
    模拟火车带你游西藏
    javascript技巧参考
    flex 与asp.net 配合之道
    ‍Android 尺寸和分辨率
    【windows】windows生产力/性能分析工具下载链接归档
  • 原文地址:https://www.cnblogs.com/linfengs/p/11714595.html
Copyright © 2011-2022 走看看