有乙個衝動 重溫Python交換排序演算法之氣泡排序

2021-10-05 07:49:58 字數 3624 閱讀 1496

排序演算法,一般都實現為就地排序,輸出為公升序;

基本實現

思考時,將問題規模減小,一般2次不一定能找到規律,3次基本上可以看出規律。所以,我們思考時認

為列表裡面就只有4個元素。

nums =[5

,1,4

,2,8

] count=

0swap_count =

0# 輔助評估演算法: count表示比較的次數,count_swap表示交換的次數

for i in

range

(len

(nums)-1

):# i 控制趟數

# 本趟內兩兩比較,大數換到右邊-->>>

for j in

range

(len

(nums)-1

-i):

count+=

1if nums[j]

> nums[j+1]

:# 只有大於才交換,小於等於就不用了

nums[j]

,nums[j+1]

= nums[j+1]

,nums[j]

s_c +=

1print

(nums)

print

("本版本問題:沒有考慮提前結束的情況,導致比較次數為"

,count,

"次")

print

("本python氣泡排序演算法版本,交換次數"

,swap_count)

# 如果某一趟兩兩比較後沒有發生任何交換,說明什麼?

[1, 2, 4, 5, 8]

本版本問題:沒有考慮提前結束的情況,導致比較次數為 10 次

本python氣泡排序演算法版本,交換次數 0

# nums = [5, 1, 4, 2, 8]

# nums = [1,2,3,4,5,6,7,8,9] # 氣泡排序演算法優化demo1:

#如果兩兩從無交換,說明已經可以大團結

nums =[9

,8,1

,2,3

,4,5

,6,7

]flag =

false

count=

0swap_count =

0for i in

range

(len

(nums)-1

):for j in

range

(len

(nums)-1

-i):

count+=

1if nums[j]

> nums[j+1]

: nums[j]

,nums[j+1]

= nums[j+1]

,nums[j]

s_c +=

1 flag =

true

ifnot flag:

# 如果兩兩從無交換,說明已經可以大團結,的自然表達

break

print

(nums)

print

("本版本問題:人工可以看到只需要比較21次就夠了,但是實際比較了:"

,count,

"次")

print

("本python氣泡排序演算法版本,交換次數"

,swap_count)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

本版本問題:人工可以看到只需要比較21次就夠了,但是實際比較了: 36 次

本python氣泡排序演算法版本,交換次數 0

上面**合適嗎?假設的是每一趟,只要有一趟沒有發生交換,就可以認為已經是目標順序了。要把標記放在 i 迴圈裡。

# nums = [5, 1, 4, 2, 8]

# nums = [1,2,3,4,5,6,7,8,9] #

# nums =[9

,8,1

,2,3

,4,5

,6,7

]# flag修正 demo

# flag = false # 修正,flag在外面會導致變為true之後,無法下次外迴圈中重置為false

count=

0swap_count =

0for i in

range

(len

(nums)-1

):

flag =

false

# 修正到這裡

for j in

range

(len

(nums)-1

-i):

count+=

1if nums[j]

> nums[j+1]

: nums[j]

,nums[j+1]

= nums[j+1]

,nums[j]

s_c +=

1 flag =

true

ifnot flag:

# break

print

(nums)

print

("比較次數"

,count)

print

("本python氣泡排序演算法版本,交換次數"

,swap_count)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

比較次數 21

本python氣泡排序演算法版本,交換次數 0

# nums = [5, 1, 4, 2, 8]

nums =[2

,1,3

,4,5

,6,7

,8,9

]# 氣泡排序演算法優化demo1:

#如果兩兩從無交換,說明已經可以大團結

flag =

1 count =

0swap_count =

0for i in

range

(len

(nums)-1

):if flag ==0:

break

else

:for j in

range

(len

(nums)-1

-i):

count+=

1if nums[j]

> nums[j+1]

: nums[j]

,nums[j+1]

= nums[j+1]

,nums[j]

s_c +=

1 flag =

1print

(nums)

print

("比較次數"

,count)

print

("本python氣泡排序演算法版本,交換次數"

,swap_count)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

比較次數 36

本python氣泡排序演算法版本,交換次數 0

有乙個地方

今天早上的比賽終於還是勇士獲得了勝利,當時是有點小情緒,不過還好,畢竟我是較中立的球迷,當然卻還是希望雷霆贏。籃球嘛已經體會很多了。今天世界上最失落的人之一會有杜蘭特和威少吧。晚上跑步在操場遇見了隔壁班的乙個女生,挺好的,因為終於能在操場看到自己喜歡的影子了,重點當然是我認識。最近在進行乙個是軟體工...

重溫Delphi之 如何定義乙個類

先談談工具問題 雖然d7很經典,但畢竟是02年出的開發工具了,對於習慣了vs2008被微軟寵壞的.net程式設計師來講,重返d7已經有點找不著感覺了 起碼連最基本的 摺疊功能都沒有 還好delphi開發工具並沒有停步不前,新出來的delphi2010已經做得很不錯了,建議delphi迷們與時俱進,換...

python定義乙個 Python定義乙個類

在物件導向的世界裡,你的 通常稱為 類的方法 method,而資料通常稱為 類的屬性 attribute,例項化的資料物件通常稱為 例項 instance。python使用class建立類。每個定義的類都有乙個特殊的方法,名為 init 可以通過這個方法控制如何初始化物件。類中方法的定義與函式的定義...