您的位置:首页 > 编程语言 > Python开发

Python实现经典排序算法-冒泡排序

2019-04-01 11:24 387 查看

冒泡排序(Bubble Sort)

1.冒泡排序概述

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2.算法思想

  • 算法分析:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  • 稳定性:稳定
  • 算法总结: 冒泡排序对n个项目需要O(n**2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元素的数列排序是很没有效率的。

3.代码实现

# 先分析模型,假定数46532,五个数
# ①先从左往右分析,最大数往右边靠
# 46531
# 46531 >> 45631 >> 45361 >> 45316  第一回合
# 45316 >> 43516 >> 43156  第二回合
# 34156 >> 31456  第三回合
# 13456  第四回合

# 冒泡排序,从左往右排序,先把下的放在最左边
def bubble1(list1):
for i in range(len(list1)-1):
for j in range(len(list1)-i-1):
if list1[j] > list1[j+1]:
list1[j] ,list1[j+1] = list1[j+1] ,list[j]
return list1
# ②这个从右往左算法,每次把最小的数放在左边
# 46531
# 46513 >> 46153 >> 41653 >> 14653  第一回合
# 14635 >> 14365 >> 13465  第二回合
# 13456 >> 13456 第三回合  这个位置,我们发现他们之前的数比较完之后顺序整符合要求,就不改变位置了
# 13456  第四回合
# 冒泡排序,从右往左排序,先把下的放在最左边
def bubble2(list1):
for i in range(len(list1)-1):
for j in range(len(list1)-1,i,-1):
if list1[j] < list1[j-1]:
list1[j],list1[j-1] = list1[j-1],list1[j]
return list1

4.代码优化

冒泡排序如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,也可以把最优情况下的复杂度降低到O(n)。在这个情况,已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序反过来,也可以稍微地改进效率。

# ③更高效的算法
# 时间复杂度为O(N^2)
# 可以设定一个标记判断这一回合是否发生交换,如果没有发生交换,可以结束这回合排序
# 找一个极限数12345 用从左到右的冒泡法排序
def bubble3(list1):
count = 0
for
20000
i in range(len(list1)-1):
flag = True
for j in range(len(list1)-i-1):
count += 1
if list1[j] > list1[j+1]:
list1[j] ,list1[j+1] = list1[j+1] ,list1[j]
flag = False
if flag:
break
return list1,count

print(bubble3([2,3,6,4]))

以上代码在python3.7.3环境下测试通过

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: