1.什麼是氣泡排序:
氣泡排序(bubble sort)是一種交換排序,它重複地走訪過要排序的元素,依次比較兩個相鄰的元素,一層一層的將較大的元素往後移動,其現象和氣泡在上公升過程中慢慢變大類似,故成為氣泡排序。
2.演算法思想
1,從第乙個和第二個開始比較,如果第乙個比第二個大,則交換位置,然後比較第二個和第三個,逐漸往後,
2,經過第一輪後最大的元素已經排在最後,所以重複上述操作的話第二大的則會排在倒數第二的位置。
3,那重複上述操作n-1次即可完成排序,因為最後一次只有乙個元素所以不需要比較
假設有乙個大小為 n 的無序序列。以公升序氣泡排序為例,氣泡排序就是要每趟排序過程中通過兩兩比較相鄰元素,將小的數字放到前面,大的數字放在後面。
例如:輸入:5,4,1,3,2
輸出:1,2,3,4,5
此時無序序列為
python3**實現:
# -*- coding: utf-8 -*-
"""created on sun jul 7 17:24:03 2019
@author: zqq
"""def
bubblesort
(input_list)
:'''
函式說明:氣泡排序(公升序)
parameters:
input_list - 待排序的列表
returns:
sorted_list - 公升序排序後的列表
'''iflen
(input_list)==0
:return
# 第一層for表示迴圈的遍數
else
:# 外迴圈,每次使得有序的數增加乙個
for i in
range
(len
(input_list)-1
):# 這個迴圈負責設定氣泡排序的次數,n個數要進行n-1次冒泡
print
('第%d趟排序:'
%(i +1)
)for j in
range
(len
(input_list)
- i -1)
:# j為列表下標 # 第二層for表示具體比較哪兩個元素
if input_list[j]
> input_list[j +1]
: input_list[j]
, input_list[j +1]
= input_list[j +1]
, input_list[j]
print
(input_list)
return input_list
input_list =[5
,4,1
,3,2
]print
('排序前:'
,input_list)
sorted_list = bubblesort(input_list)
print
('排序後:'
3.演算法分析
時間複雜度:
時間複雜度:因為它需要雙層迴圈n*(n-1)),所以平均時間複雜度為o(n^2)
空間複雜度:只需要常數個輔助單元,所以空間複雜度為o(1),我們把空間複雜度為o(1)的排序成為原地排序(in-place)
演算法穩定性:
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。
4.優化
當我們在進行技術面的時候,不能只是簡單的實現某個演算法功能,還要考慮演算法的複雜性,對演算法進行優化,當然,這部分會比較難,但是這也是演算法工程師的必備技能。
對氣泡排序常見的改進方法是加入標誌性變數exchange,用於標誌某一趟排序過程中是否有資料交換。
如果進行某一趟排序時並沒有進行資料交換,則說明所有資料已經有序,可立即結束排序,避免不必要的比較過程。
# -*- coding: utf-8 -*-
"""created on mon jul 8 10:08:42 2019
@author: zqq
"""import random
defbubblesort_plus
(input_list)
:'''
函式說明:氣泡排序(公升序)
引數:input_list:待排序的列表
returns:
sorted_list:公升序排序好的列表
'''iflen
(input_list)==0
:return
else
:for i in
range
(len
(input_list)-1
):# 負責設定氣泡排序進行的次數(比如說n個數,則只要進行n-1次冒泡,就可以把這個n個數排序好)
exchange =
false
# 用於優化,沒有交換時表示已經有序,結束迴圈
for j in
range
(len
(input_list)
- i -1)
:"""
這裡這個j呢就是控制每一次具體的冒泡過程,請你想一想,我們第一次冒泡需要冒幾次,也就是說需要比較幾次,
假如有三個數,那只需要兩次就可以了,當下一次時,最後乙個
已經是有序的了,所以說少冒泡一次,所以這裡j每次都會減去i的值,即不用冒「無用之泡泡」
"""if input_list[j]
> input_list[j +1]
:# input_list[j] = input_list[j + 1]
# input_list[j + 1] = input_list[j] # 這樣會導致資料丟失
input_list[j]
, input_list[j +1]
= input_list[j +1]
, input_list[j]
exchange =
true
ifnot exchange:
break
return input_list
input_list =
list
(range(10
))#產生乙個有序列表
random.shuffle(input_list)
# 呼叫shuffle函式打亂順序
print
(input_list)
# 排序前
res = bubblesort_plus(input_list)
# 呼叫氣泡排序演算法
print
(res)
input_list =[5
,4,1
,3,2
]print
('排序前:'
,input_list)
sorted_list = bubblesort_plus(input_list)
print
('排序後:'
,sorted_list)
氣泡排序是一種簡單直接暴力的排序演算法,為什麼說它暴力?因為每一輪比較可能多個元素移動位置,而元素位置的互換是需要消耗資源的,所以這是一種偏慢的排序演算法,僅適用於對於含有較少元素的數列進行排序。降序的話,根據比較值的大小,交換的位置換一下即可。
引用以及參考:
**實現彩色參考:
資料結構與演算法 python排序演算法 氣泡排序
排序演算法 英語 sorting algorithm 是一種能將一串資料依照特定順序進行排列的一種演算法。排序演算法的穩定性 穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果乙個排序演算法是穩定的,當有兩個相等鍵值的紀錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是...
資料結構之快排(python實現)
受益於一位前輩的快排部落格,感謝感恩開源,記錄一下用python實現的快排 主要思想 分而治之 以基準數為分界線,左邊比其小,右邊比其大 1.i l,j r,取出基準數s i 形成第乙個坑 2.j 由後向前找比基準數小的數,找到後填到前乙個坑s i 中 3.i 由前向後找比基準數大的數,找到後填到第...
資料結構與演算法 python實現快排
python實現快速排序 記錄第乙個坑的值,在最後做填充 i start 初始位置和末尾會發上改變,所以需要先做好記錄 j end m end 初始從最後面開始挖坑,所以先記錄 while start end while start end and l start x 找出比假定的中位數x大的數,放...