python实现冒泡排序

如何将一组数列中的数字按照从小到大( 或者从大到小) 的顺序重新排序? 几种经典的算法是: 冒泡排序\选择排序\插入排序\归并排序\快速排序\计数排序. 这篇博客简单介绍了一下冒泡排序的原理及Python实现.

冒泡排序原理

冒泡排序是对一组数列中连续的两个数字进行比较, 将数值较大的数字调整到较小的数字后面, 依次进行多伦比较和排序, 直到所有的数字排序完成. 举个例子, 假如存在一组数列为:

  • 原始数据为:

    19372
  • 第一轮排序: 依次将第1-2, 2-3, 3-4, 4-5个数字进行比较, 5个数字共比较4次, 每次比较结束后将较大的数字移动到后面, 比较的结果依次是(* 表示当前比较后排序结果)

    第一步1*9*372
    第二步13*9*72
    第三步137*9*2
    第四步1372*9*
  • 第二轮排序: 重复第一轮操作, 依次进行比较和移位, 比较结果依次是

    第一步1*3*729
    第二步13*7*29
    第三步132*7*9
    第四步1327*9*
  • 第三轮排序: 可以发现, 第一步比较结束后, 排序已经满足要求了, 但是计算机还是要按照程序执行所有的比较.

    第一步1*3*279
    第二步12*3*79
    第三步123*7*9
    第四步1237*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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值