如何将一组数列中的数字按照从小到大( 或者从大到小) 的顺序重新排序? 几种经典的算法是: 冒泡排序\选择排序\插入排序\归并排序\快速排序\计数排序. 这篇博客简单介绍了一下冒泡排序的原理及Python实现.
冒泡排序原理
冒泡排序是对一组数列中连续的两个数字进行比较, 将数值较大的数字调整到较小的数字后面, 依次进行多伦比较和排序, 直到所有的数字排序完成. 举个例子, 假如存在一组数列为:
-
原始数据为:
1 9 3 7 2 -
第一轮排序: 依次将第1-2, 2-3, 3-4, 4-5个数字进行比较, 5个数字共比较4次, 每次比较结束后将较大的数字移动到后面, 比较的结果依次是(* 表示当前比较后排序结果)
第一步 1* 9* 3 7 2 第二步 1 3* 9* 7 2 第三步 1 3 7* 9* 2 第四步 1 3 7 2* 9* -
第二轮排序: 重复第一轮操作, 依次进行比较和移位, 比较结果依次是
第一步 1* 3* 7 2 9 第二步 1 3* 7* 2 9 第三步 1 3 2* 7* 9 第四步 1 3 2 7* 9* -
第三轮排序: 可以发现, 第一步比较结束后, 排序已经满足要求了, 但是计算机还是要按照程序执行所有的比较.
第一步 1* 3* 2 7 9 第二步 1 2* 3* 7 9 第三步 1 2 3* 7* 9 第四步 1 2 3 7* 9* 通过上面的3轮排序, 直观上感觉排序已经符合要求了, 但这是特例, 部分数字的初始排序效果较好, 使得排序提前完成了, 在算法原理中, 还要进行一轮排序, 才能保证所有的数字排序正确无误, 此处不再进行示例.
通过比较可以发现, 第一轮比较是将最大的一个数字放到最后一位, 第二轮比较是将第二大的数字放到倒数第二位, 依次类推, n个数字全部排序完成需要进行n+1轮排序, 因此算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2).
python代码实现
首先,创建一个生成随机数组的程序: randomList.py
#-*- coding:utf-8 -*-
# Created Date: 2020/03/10
import random
def random_list(n):
"""返回一个长度为n的随机数列表,数值为[0,1000)"""
print("Input number is :{}\n".format(n))
iList = []
for num in range(n):
iList.append(random.randrange(1000))
return iList
if __name__ == "__main__":
iList = random_list(10)
print(iList)
然后, 创建冒泡排序算法程序: bubbleSort.py
#-*- coding:utf-8 -*-
# Created Date:2020/03/10
from random_list import random_list
import timeit
import sys
# 调用sys库argv函数从外部传入参数
tt_num = sys.argv[1]
print("\nTotal number is :{}\n".format(tt_num))
# 调用从random_list程序中导入的random_list函数
iList = random_list(int(tt_num))
def bubble_sort(iList):
"""定义冒泡排序的函数"""
if len(iList) <= 1:
return iList
for i in range(1, len(iList)):
for j in range(0, len(iList)-1):
if iList[j] >= iList[j + 1]:
iList[j], iList[j+1] = iList[j+1], iList[j]
# print("The {}th sort results is: {}".format(j, iList))
return iList
if __name__ == "__main__":
print("the original datas are: {}".format(iList))
print("the sorted results are: {}".format(bubble_sort(iList)))
print(timeit.timeit("bubble_sort(iList)", "from __main__ import bubble_sort, iList", number = 100))
在命令行中输入指令
python bubble_list.py 10
得到结果为
Total number is :10
Input number is :10
the original datas are: [840, 71, 176, 442, 897, 421, 58, 196, 399, 214]
the sorted results are: [58, 71, 176, 196, 214, 399, 421, 442, 840, 897]
0.0016825