概要
-IDE:Pycharm
-Python版本:python3.x
-算法分类:内部排序->交换类排序->冒泡排序
算法思想
反复扫描待排序记录序列,在扫描过程中顺次比较相邻元素,若逆序则交换位置。
以升序为例:在第一趟冒泡排序中,从第一个记录开始,扫描整个待排序列,若相邻逆序,交换位置。扫描过程中,不停的将较大的关键字向后移,最大的数字必然在第一趟之后排到最后。
对前$n-1$个序列进行同样的操作,其结果是使次大的数字排到第$n-1$的位置上。直到$n=1$排序完毕。
算法分析
冒泡排序算法的最坏情况是待排序列记录按关键字逆序排序列,此时第$i$趟冒泡排序需进行$n-i$次比较,$3(n-i)$次移动。经过$n-1$趟排序之后,总的比较次数为$sum_{i=1}^{n-1}n-i=n(n-1)/2$,总的移动次数为$3n(n-1)/2次。
稳定性与时间复杂度
排序算法 | 稳定性 | 时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|---|---|
冒泡排序 | 稳定 | $O(n^2)$ | $O(n)$ | $O(n^2)$ | $O(1)$ |
Python代码清单
# !/usr/bin/python3
# _*_ coding:utf-8 _*_
# 冒泡排序
import time, sys, random
def BS(number,maxNumber):
# 生成随机数
timeStart = time.time() # 记录开始时间
listA = [] # 空的列表,用于存放生成的随机数。
for i in range(0, number): #开始生成随机数
listA.append(random.randint(0, maxNumber))
timeEnd = time.time() # 结束时间
timeIs = timeEnd - timeStart # 生成随机数花费的时间。
print('生成%d个数花费的时间是%f' % (number, timeIs))
print(listA)
####################################################
#冒泡排序算法
timeStart = time.time()
for itme in range(number): # 外层的循环,从零开始循环
for itme2 in range(0, number-1-itme): # 内层循环,从0开始循环。切记循环到数组元素个数减一。否则会out of index
if listA[itme2] > listA[itme2+1]: # 判断大小
mid = listA[itme2+1] # 中间变量
listA[itme2+1] = listA[itme2] # 赋值给后一个变量
listA[itme2] = mid # 复制给前一个变量
timeEnd = time.time()
timeIs = timeEnd - timeStart
print(listA) # 输出排好的list
print('排序%d个数花费的时间是%f' % (number, timeIs))
if __name__ == '__main__':
helpInfo = '''
This program is for Bubble Sort.
How to use it! Follow the example!
python Bubble_Sort.py 10 100
The 10 representative will generate ten numbers.
100 representative the max-number you make.
'''
command = sys.argv[0:] # 从键盘接受传来的参数
if len(command) != 3 or 'help' in command: # 验证参数是否时三个和是否有‘help’存在
print(helpInfo) # 打印帮助
else:
try:
number = int(command[1]) # 尝试将输入转化为int型,这个是产生随机数的总个数
maxNumber = int(command[1]) # 这个事产生随机数的最大数。
except ValueError: # 检测到值错误
print(helpInfo) # 打印帮助文本
sys.exit(1) # 退出程序
BS(number, maxNumber) # 若以上都无误,调用冒泡排序算法。
有什么问题请联系我
QQ:3116316431 (请附上信息)
E-mail:wongyinlong@yeah.net