• 数据结构与算法:冒泡排序(原理讲解+python实现)


    冒泡排序

    冒泡排序是诸多排序算法比较常用,热门的算法之一。一般作为计算机学生们的算法入门基础,有些初级软件工程师的面试也会要求手写冒泡排序的代码。在很多热门的编程语言里面也专门实现了冒泡排序的接口 可以直接调用使用,虽然平均排序效率上偏低 但有些情况下也会被频繁使用。

    原理讲解

    Python实现

     1 def bubblesort(arr, n):
     2     flag = 0  # 添加标签 如果要比较的数已经排好序 则跳出单次循环比较
     3     for i in range(n-1, -1, -1):  # 逆序遍历 每次循环得到最大的数逐个放到最后
     4         for j in range(i):
     5             if arr[j] > arr[j+1]:
     6                 arr[j], arr[j+1] = arr[j+1], arr[j]
     7                 flag = 1
     8 
     9             if flag == 0:  # 如果没有发生交换 则跳出本次循环
    10                 break
    11 
    12 if __name__ == '__main__':
    13     arr = [40, 30, 10, 20, 60, 50, 70, 80, 90,90]
    14     n = len(arr)
    15     bubblesort(arr, n)  #用冒泡排序进行升序排序
    16     print(arr)

    时间,空间复杂度,稳定性分析

    冒泡排序的时间复杂度最差、最好、平均都是O(n2), 因为无论序列是否排好序 都需要比较 n(n-1)/2次。 针对加了标签flag的优化版本 如果序列本身就是有序的 则每次循环都比较1次就跳出来 最终总共比较了n-1次 所以时间复杂度为O(n) 如果是完全逆序的 则时间复杂度就是O(n2) 平均复杂度就是O(n2). 

    冒泡排序的空间复杂度是O(1) 因为整个过程只有两个for循环的比较 还有在元素交换时 需要开启的一个临时中间变量的内存 所以空间上是O(1)的复杂度。

    冒泡排序是一种稳定排序 通过代码我们可以发现如果相邻两个元素相等 它们之间是不会发生交换动作的 原来排在前面的元素还是排在前面。

  • 相关阅读:
    Java程序性能优化——让你的java程序更快、更稳定
    synchronized和ReentrantLock
    Java集合——ConcurrentHashMap
    SpringMVC流程
    计算机网络http,https,tcp,udp,get,post
    JVM类加载机制
    关于strcpy和memcpy
    C语言指针
    malloc函数详解
    进程和线程
  • 原文地址:https://www.cnblogs.com/confessionlouis/p/14261339.html
Copyright © 2020-2023  润新知