• 基础算法之冒泡排序算法


    基本思想:

    在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    以随机产生的五个数为例: li=[354,405,469,82,345]
    冒泡排序是怎么实现的?
    首先先来个大循环,每次循环找出最大的数,放在列表的最后面。在上面的例子中,第一次找出最大数469,将469放在最后一个,此时我们知道
    列表最后一个肯定是最大的,故还需要再比较前面4个数,找出4个数中最大的数405,放在列表倒数第二个......

    5个数进行排序,需要多少次的大循环?? 当然是4次啦!同理,若有n个数,需n-1次大循环。

    现在你会问我: 第一次找出最大数469,将469放在最后一个??怎么实现的??
    嗯,(在大循环里)用一个小循环进行两数比较,首先354与405比较,若前者较大,需要交换数;反之不用交换。
    当469与82比较时,需交换,故列表倒数第二个为469;469与345比较,需交换,此时最大数469位于列表最后一个啦!

    难点来了,小循环需要多少次??

    进行两数比较,从列表头比较至列表尾,此时需len(array)-1次!! 但是,嗯,举个例子吧: 当大循环i为3时,说明此时列表的最后3个数已经排好序了,不必进行两数比较,故小循环需len(array)-1-3. 即len(array)-1-i

    代码如下:

    >>> def bubble(array):
        for i in range(len(array)-1):
         exchange = False
    for j in range(len(array)-i-1): if array[j] > array[j+1]: array[j],array[j+1] = array[j+1],array[j]
              exchange = True
         if not exchange:
            break
    >>> array = [3,4,42,9,1] >>> bubble(array) >>> print(array) [1, 3, 4, 9, 42]

    注:这里进行了一步优化,加入了一个exchange判断符,如果exchange是False,说明剩下未排列的那些数据没有进行过交换,也就是说已经全部排序完成

    冒泡排序复杂度: 

    时间复杂度: 最好情况O(n), 最坏情况O(n^2), 平均情况O(n^2)

    转自http://www.cnblogs.com/0zcl/p/6664809.html

    人生苦短,何不用python
  • 相关阅读:
    php 安装 Redis 扩展
    远程连接mysql出现"Can't connect to MySQL server 'Ip' ()"的解决办法
    MySQL 连接超时:报错SQLSTATE[HY000] [2002] Connection timed out解决
    linux命令解压压缩rar文件
    Xshell、Xftp评估过期的解决办法
    远程连接mysql出现1045错误的解决办法
    PHP 判断当前日期是否是法定节假日或者休息日
    PHP解压压缩包文件到指定目录的实现
    PHP逐行解析文件,并写入数据库
    PHP编程实现多维数组按照某个键值排序的方法
  • 原文地址:https://www.cnblogs.com/yqpy/p/8647322.html
Copyright © 2020-2023  润新知