排序演算法,一般都實現為就地排序,輸出為公升序;
基本實現
思考時,將問題規模減小,一般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 可以通過這個方法控制如何初始化物件。類中方法的定義與函式的定義...