冒泡排序
Posted 在这里, 意淫和实干都值得尊重
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序相关的知识,希望对你有一定的参考价值。
冒泡排序
描述:
1. 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
2. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。
原理:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
标准版:
def bubble_sort(li):
n = len(li)
for i in range(n - 1):
judge = True
for j in range(0, n - 1 - i):
if li[j] > li[j + 1]:
li[j], li[j + 1] = li[j + 1], li[j]
judge = False
if judge:
break
return li
注释版:
def bubble_sort(li):
n = len(li)
# n为列表的长度
for i in range(n - 1):
# 外层循环控制内层循环执行的次数, i为第几趟
# for i in range(n - 1): 等价于 for i in range(len(li) - 1)
# 后者属于未优化状态, 因为每执行一次循环都需要计算一下列表的长度
judge = True
for j in range(0, n - 1 - i):
# 内层循环执行一次, 选出当前数组中最大的一个值
# n - 1 - j 注: 执行一次循环后, 选出最大的值, 下次比较就不用再比较它了
if li[j] > li[j + 1]:
# 如果前者大于后者, 交换位置
li[j], li[j + 1] = li[j + 1], li[j]
judge = False
if judge:
break
# 布尔值的优化, 如果序列已经排好序, 不会进入if判断语句, 直接跳出循环结束函数
return li
# 将冒号后的列表, 返回
if __name__ == "__main__":
l = list(i for i in range(0, 10000))
print("洗牌之前的列表:" + str(l))
random.shuffle(l)
# shuffle()函数是random模块内的一个洗牌函数, 顾名思义: 将有序的列表的顺序打乱
print("洗牌之后的列表:" + str(l))
print("冒泡之后的列表:" + str(bubble_sort(l)))
时间复杂度:
最好情况O(n):
文件的初始状态是正序的,一趟扫描即可完成排序。
所需的关键字比较次数和记录交换次数均达到最小值
所以,冒泡排序最好的[时间复杂度]为O(n)
最坏情况O(n^2):
若初始文件是反序的,需要进行n趟排序。
每趟排序要进行n-1次关键字的比较,且每次比较都需要交换记录位置。
在这种情况下,比较和交换次数均达到最大值:
冒泡排序的最坏时间复杂度为O(n^2) n^2的意思是n的2次方
平均时间复杂度O(n^2):
平均时间复杂度一般都为最坏时间复杂度.
因为算法也是为了解决问题而产生的, 要完美的解决问题, 必须考虑到最坏情况, 并给出解决方案
稳定性:
冒泡算法的原理就是从左向右相邻的元素两两对比,如果前者大于后者,则进行交换。如果两个元素相等,是不会交换其位置的,因此冒泡排序是稳定的。
注:如果将交换条件改为“list[i]>=list[i+1]”就不是稳定的了。
以上是关于冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章