久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python3冒泡排序算法及其優(yōu)化

 hdzgx 2019-12-27

冒泡排序

所謂冒泡,,就是將元素兩兩之間進(jìn)行比較,,誰大就往后移動,,直到將最大的元素排到最后面,,接著再循環(huán)一趟,,從頭開始進(jìn)行兩兩比較,,而上一趟已經(jīng)排好的那個元素就不用進(jìn)行比較了,。(圖中排好序的元素標(biāo)記為黃色柱子)

冒泡排序動圖演示

上python代碼:

  1. def bubble_sort(items):
  2. for i in range(len(items) - 1):
  3. for j in range(len(items) - 1 - i):
  4. if items[j] > items[j + 1]:
  5. items[j], items[j + 1] = items[j + 1], items[j]
  6. return items
  7. list1 = [2,1,9,11,10,8,7]
  8. print(bubble_sort(list1))

輸出結(jié)果:

[1, 2, 7, 8, 9, 10, 11]

這是冒泡排序最普通的寫法,,但你會發(fā)現(xiàn)它有一些不足之處,,比如列表:[1,2,3,4,7,5,6],第一次循環(huán)將最大的數(shù)排到最后,,此時列表已經(jīng)都排好序了,,就是不用再進(jìn)行第二次、第三次...

冒泡排序優(yōu)化一:

設(shè)定一個變量為False,,如果元素之間交換了位置,,將變量重新賦值為True,最后再判斷,在一次循環(huán)結(jié)束后,,變量如果還是為False,,則brak退出循環(huán),結(jié)束排序,。

  1. def bubble_sort(items):
  2. for i in range(len(items) - 1):
  3. flag = False
  4. for j in range(len(items) - 1 - i):
  5. if items[j] > items[j + 1]:
  6. items[j], items[j + 1] = items[j + 1], items[j]
  7. flag = True
  8. if not flag:
  9. break
  10. return items

冒泡排序優(yōu)化二:攪拌排序 / 雞尾酒排序

上面這種寫法還有一個問題,,就是每次都是從左邊到右邊進(jìn)行比較,這樣效率不高,,你要考慮當(dāng)最大值和最小值分別在兩端的情況,。寫成雙向排序提高效率,即當(dāng)一次從左向右的排序比較結(jié)束后,,立馬從右向左來一次排序比較,。

雙向排序動圖演示

python代碼:

  1. def bubble_sort(items):
  2. for i in range(len(items) - 1):
  3. flag = False
  4. for j in range(len(items) - 1 - i):
  5. if items[j] > items[j + 1]:
  6. items[j], items[j + 1] = items[j + 1], items[j]
  7. flag = True
  8. if flag:
  9. flag = False
  10. for j in range(len(items) - 2 - i, 0, -1):
  11. if items[j - 1] > items[j]:
  12. items[j], items[j - 1] = items[j - 1], items[j]
  13. flag = True
  14. if not flag:
  15. break
  16. return items

冒泡排序優(yōu)化三:

最后要考慮的情況就是,如果給你的不是列表,,而是對象,,或者列表里面都是字符串,那么上述的代碼也就沒有用了,,這時候你就要自定義函數(shù)了,,并將其當(dāng)成參數(shù)傳入bubble_sort函數(shù)

python代碼:

  1. def bubble_sort(items, comp=lambda x, y: x > y):
  2. for i in range(len(items) - 1):
  3. flag = False
  4. for j in range(len(items) - 1 - i):
  5. if comp(items[j],items[j + 1]):
  6. items[j], items[j + 1] = items[j + 1], items[j]
  7. flag = True
  8. if flag:
  9. flag = False
  10. for j in range(len(items) - 2 - i, 0, -1):
  11. if comp(items[j - 1],items[j]):
  12. items[j], items[j - 1] = items[j - 1], items[j]
  13. flag = True
  14. if not flag:
  15. break
  16. return items
  17. list2 = ['apple', 'watermelon', 'pitaya', 'waxberry', 'pear']
  18. print(bubble_sort(list2,lambda s1,s2: len(s1) > len(s2))) #按照字符串長度從小到大來排序

輸出結(jié)果:

['pear', 'apple', 'pitaya', 'waxberry', 'watermelon']

類似的,當(dāng)有人叫你給一個類對象排序時,,也可以傳入lambda 自定義函數(shù),。

  1. class Student():
  2. """學(xué)生"""
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6. def __repr__(self):
  7. return f'{self.name}: {self.age}'
  8. items1 = [
  9. Student('Wang Dachui', 25),
  10. Student('Di ren jie', 38),
  11. Student('Zhang Sanfeng', 120),
  12. Student('Bai yuanfang', 18)
  13. ]
  14. print(bubble_sort(items1, lambda s1, s2: s1.age > s2.age))

輸出結(jié)果:按照年齡從小到大排序

[Bai yuanfang: 18, Wang Dachui: 25, Di ren jie: 38, Zhang Sanfeng: 120]

 

以上就是關(guān)于冒泡排序的原理,以及一些優(yōu)化寫法

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多