码迷,mamicode.com
首页 > 编程语言 > 详细

python 冒泡算法

时间:2020-03-12 14:18:45      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:假设   nbsp   应该   冒泡算法   col   最大数   span   长度   turn   

冒泡规则:

  • 每一轮获取第一个数和后面的数据进行依次比较的过程,称为一轮冒泡的过程
  • 每一轮冒泡,都是先拿第一个数,依次比对相领的两个数,如果前一个数比后一个数大,则交换他们的位置,这一轮比较完,会把最大的数放在最后面
  • 然后反复重复上面的步聚(每一轮都能将前面的数据中一个最大数,放到后面),直到一轮冒泡下来没有任何数据需交互位置,此时数据已经为有序状

冒泡的次数:

  • 假设列表的长度为n,冒泡排序是每次拿出来第一个元素,需要拿多少次呢?应该是列表的长度减1,意味着每一个长度为n的列表,需要冒泡n-1次

每次冒泡的比较次数:

  • 第一次冒泡,需要进行依次比较的数为n-次,每一次冒泡,都能排好一个数据的顺序,那么随着冒泡次数的增加排好的数据也会越多,需要比较的数据就越少。

关系图如下:

第几次冒泡                   比较的次数                          
1 n-1
2 n-2
3 n-3
4 n-4

 

 

 

 

 

 

根据以上分析,我们找出了冒泡次数和比较次数的关系,接下来就可以通过找码来实现了

 1 a = [1,5,2,3,8,9]
 2 def func(li):
 3     n = len(li)
 4     # 遍历列表长度减1
 5     for i in range(1,n ):
 6         # 创建一个变量,用来记录本轮冒泡是否有数据交换位置
 7         status = False
 8         # 每次遍历都获取第一个元素,依次和后面的元素进行比较
 9         for j in range(n - i ):
10             # 判断当前元素与后一个元素的值
11             if li[j] > li[j+1]:
12                 # 交换当前元素与后一个元素的值
13                 li[j],li[j+1] = li[j+1],li[j]
14                 # 只要有数据交换位置,则修改status的值
15                 status = True
16         # 每一轮冒泡结束之后,判断当前的status是否为False,如果为False,
17         # 则说明一轮冒泡没有修改任何数据的顺序,即表示列表是有序的,则直接返回,无需重复循环
18         if not status:
19             return li
20 
21     return li
22 
23 print(func(a))

 柠檬班

python 冒泡算法

标签:假设   nbsp   应该   冒泡算法   col   最大数   span   长度   turn   

原文地址:https://www.cnblogs.com/listong/p/12468722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!