zoukankan      html  css  js  c++  java
  • 数据结构之内部排序--冒泡排序

    概要

    -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

  • 相关阅读:
    JavaScript基础学习篇
    js,html,css注释大集合
    JS中的专业术语
    BFC给我的帮助以及对hasLayout的认识
    框架
    PHP echo和print语句
    PHP变量
    PHP语法
    PHP入门
    SQLite学习网址
  • 原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950091.html
Copyright © 2011-2022 走看看