資料結構 Python實現氣泡排序(1)

2021-09-25 01:47:39 字數 4206 閱讀 1202

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大的數,放...