zoukankan      html  css  js  c++  java
  • 冒泡排序

    一、前言

    冒泡排序是一种交换排序。

    什么是交换排序呢?

    答曰:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。

    二、算法思想

    它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

    这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。

    动态效果示意图:

    排序(1):冒泡排序

    假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。

    def bubbleSort(input_list):
        '''
        函数说明:冒泡排序(升序)
        Author:
            www.cuijiahua.com
        Parameters:
            input_list - 待排序列表
        Returns:
            sorted_list - 升序排序好的列表
        '''
        if len(input_list) == 0:
            return []
        sorted_list = input_list
        for i in range(len(sorted_list) - 1):
            print('第%d趟排序:' % (i + 1))
            for j in range(len(sorted_list) - 1):
                if sorted_list[j + 1] < sorted_list[j]:
                    sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
                print(sorted_list)
        return sorted_list
     
    if __name__ == '__main__':
        input_list = [50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
        print('排序前:', input_list)
        sorted_list = bubbleSort(input_list)
        print('排序后:', sorted_list)

     

    三、算法分析

    1、冒泡排序算法的性能

    排序(1):冒泡排序

    2、时间复杂度

    若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin = N - 1, Mmin = 0。所以,冒泡排序最好时间复杂度为O(N)。

    但是上述代码,不能扫描一趟就完成排序,它会进行全扫描。所以一个改进的方法就是,当冒泡中途发现已经为正序了,便无需继续比对下去。改进方法一会儿介绍。

    若初始文件是反序的,需要进行 N -1 趟排序。每趟排序要进行 N - i 次关键字的比较(1 ≤ i ≤ N - 1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

    Cmax = N(N-1)/2 = O(N^2)

    Mmax = 3N(N-1)/2 = O(N^2)

    冒泡排序的最坏时间复杂度为O(N^2)。

    因此,冒泡排序的平均时间复杂度为O(N^2)。

    总结起来,其实就是一句话:当数据越接近正序时,冒泡排序性能越好。

    3、算法稳定性

    假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

    冒泡排序就是把小的元素往前调或者把大的元素往后调。是相邻的两个元素的比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

    整理自:https://cuijiahua.com/blog/2017/12/algorithm_1.html

  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/GeorgeJ/p/11644675.html
Copyright © 2011-2022 走看看