日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实现真正的冒泡排序算法(时间复杂度优化版)!

發布時間:2025/3/20 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现真正的冒泡排序算法(时间复杂度优化版)! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

近期很多童鞋在討論大廠面試的算法題,有部分同學表示一臉懵逼,不知從何下手,還有一一部分同學寫的冒泡排序算法是直接從網上復制下來的冒泡排序,大多數都沒有考慮時間復雜度,說白了只是實現了冒泡的流程,嚴格來講只能算是一個偽冒泡排序, 那么接下來給大家來捋一捋冒泡排序的原理,只有搞懂排序的原理,才能更好的掌握,寫出真正的冒泡排序算法:

1、冒泡排序原理

直觀點先看圖(注:圖片來源于網絡)

從上圖我們可以看出冒泡排序的規則,歸納幾點如下:
冒泡的規則:

  • 每一輪獲取第一個數和后面的數據進行依次比較的過程,稱為一輪冒泡的過程
  • 每一輪冒泡.都是先拿第一個數,依次比對相鄰的兩個數,如果前一個數比后一個數大,則交換他們的位置,這一輪比較完畢,會把最大的數放在最后面。
  • 然后反復重復上面的步驟(每一輪都能將前面數據中一個最大數,放到后面),直到一輪冒泡下來沒有任何數據需交互位置,此時數據已經為有序狀態

冒泡的次數:

假設列表的長度為n,冒泡排序是每次拿出來第一個元素,需要拿多少次呢?應該是列表的長度減1,意味著每一個長度為n的列表,需要冒泡 n-1 次
每次冒泡比較的次數:

每一次冒泡,都能排好一個數據的順序,第一次冒泡,需要進行依次比較的次數為n次,那么隨著次的增加排好的數據也會越多,需要比較的數據就越少。關系圖如下:

根據以上分析我們找出了冒泡次數和,比較次數的關系,接下來就可以通過代碼來實現了,實現代碼如下:

2、python實現冒泡排序

代碼實現:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' li = [22, 3, 44, 112, 1, 442, 55, 33, 65] ? def bubble_sort(li):n = len(li)# 遍歷列表長度減1次for i in range(1, n):# 每次遍歷都獲取第一個元素,依次和后面的元素進行比較for j in range(n - i):# 判斷前元素,和后一個元素的值if li[j] > li[j + 1]:# 交換當前元素和后一個元素的值li[j], li[j + 1] = li[j + 1], li[j]return li

注意:上面的代碼根據冒泡的思路,實現了排序,但是從嚴格意義上講還是由缺陷的,不能算是真正的冒泡排序,只是一個偽冒泡排序,面試能夠把這個偽冒泡排序寫出來,大多數公司還是能過的。

3、代碼優化

眾所周知,進行冒泡排序的時候,按正常的邏輯來講,當一輪冒泡下來,所有數據的順序都沒發生改變,那么該數據就是一個有序列表了,這個時候就不會在進行下一輪冒泡了,

例如:當我們使用一個有序列表來進行冒泡排序,那么第一輪冒泡下來,所有的數據順序都不會發生改變,那么就不會再進行下一輪冒泡,這樣情況下時間復雜度為最優,只進行一輪冒泡,即O(n)。

1、缺陷分析

針對于時間復雜度最優的這種情況,在上面寫的偽冒泡排序算法中是不可能出現的,不管被排序的數據有沒有順序,都會進行n-1次冒泡,即最壞時間復雜度。

在這邊上面的偽冒泡只考慮了冒泡的過程,不管列表原來的順序,依次冒泡,全部去排一遍順序,沒有從時間復雜度的角度去做優化。

2、代碼優化

針對上述缺陷問題,接下來我們進行優化

代碼如下:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def bubble_sort(li):n = len(li)# 遍歷列表長度減1次for i in range(1, n):# 創建一個變量,用來記錄本輪冒泡,是否有數據交換位置status = False# 每次遍歷都獲取第一個元素,依次和后面的元素進行比較for j in range(n - i):# 判斷前元素,和后一個元素的值if li[j] > li[j + 1]:# 交換當前元素和后一個元素的值li[j], li[j + 1] = li[j + 1], li[j]# 只要由數據交換位置,則修改statusd的值status = True# 每一輪冒泡結束之后,判斷當前status是否為Flase,# 如果為Flase,則說明上一輪冒泡沒有修改任何數據的順序(即數據是有序的)if not status:return lireturn li

代碼解釋:上述代碼對之前的偽冒泡進行了優化,主要優化的點在于,我們每一次冒泡的時候,設置一個變量來記錄,當前這次冒泡數據的順序是否有發生改變,初始值設為False,當數據屬性發生改變時,就把這個值設為True,一輪冒泡結束后 再去判斷,這個變量是否為False,如果為False則沒有發生改變,即數據有序,那么接下來就可以直接返回數據,不需要再進行下一次冒泡。

總結

以上是生活随笔為你收集整理的python实现真正的冒泡排序算法(时间复杂度优化版)!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。