数据结构之内部排序--冒泡排序

概要

-IDE:Pycharm
-Python版本:python3.x
-算法分类:内部排序->交换类排序->冒泡排序

算法思想

反复扫描待排序记录序列,在扫描过程中顺次比较相邻元素,若逆序则交换位置。
以升序为例:在第一趟冒泡排序中,从第一个记录开始,扫描整个待排序列,若相邻逆序,交换位置。扫描过程中,不停的将较大的关键字向后移,最大的数字必然在第一趟之后排到最后
对前 n1 n − 1 个序列进行同样的操作,其结果是使次大的数字排到第 n1 n − 1 的位置上。直到 n=1 n = 1 排序完毕。

算法分析

冒泡排序算法的最坏情况是待排序列记录按关键字逆序排序列,此时第 i i 趟冒泡排序需进行ni次比较, 3(ni) 3 ( n − i ) 次移动。经过 n1 n − 1 趟排序之后,总的比较次数为 n1i=1ni=n(n1)/2 ∑ i = 1 n − 1 n − i = n ( n − 1 ) / 2 ,总的移动次数为$3n(n-1)/2次。

稳定性与时间复杂度

排序算法稳定性时间复杂度最好情况最坏情况空间复杂度
冒泡排序稳定 O(n2) O ( n 2 ) O(n) O ( n ) O(n2) O ( n 2 ) O(1) 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值