【引言】我們都經(jīng)歷過新生開學(xué),一個(gè)班里幾十個(gè)同學(xué)抠蚣,軍訓(xùn)的時(shí)候我們需要按照身高站成一隊(duì),個(gè)子高的站在后面履澳,個(gè)子矮的站在前面嘶窄。如果你是班主任的話,你會(huì)怎么讓同學(xué)調(diào)整他們之間的位置距贷,最終讓所有的人都按照身高大小站好呢柄冲?
冒泡排序是一種通過兩兩對(duì)比的方式,依次找出最值的排序方式忠蝗。
算法過程
使用冒泡排序來進(jìn)行班級(jí)里面隊(duì)伍的排列现横,就像是魚在水里吐泡泡一樣(應(yīng)該會(huì)吐吧tx)。由于壓強(qiáng)跟水深有關(guān)阁最,所以泡泡從水底升到水面的過程中會(huì)逐漸的變大戒祠,最終變到最大升出水面。排列隊(duì)伍也是一樣速种,最高的那個(gè)人會(huì)在從前到后的兩兩對(duì)比中姜盈,最終站到隊(duì)伍的最后面。
班主任在排隊(duì)的時(shí)候可以這么做(假設(shè)有 5 個(gè)同學(xué)):
1配阵、讓全班同學(xué) 不分大小 站成一列馏颂,身高分別為(隊(duì)伍從前到后):150 165 160 173 155。
2棋傍、從前向后兩兩比較救拉,首先比較1、2同學(xué):150 165 160 173 155瘫拣。
3亿絮、150 同學(xué)比 165 同學(xué)要矮,隊(duì)伍保持不動(dòng),轉(zhuǎn)而比較2壹无、3同學(xué):150 165 160 173 155葱绒。
4、165 同學(xué)比 160 同學(xué)要高斗锭,這樣地淀,兩位同學(xué) 互換位置,以保證后面的要比前面的高:150 160 165 173 155岖是。
5帮毁、繼續(xù)比較3、4同學(xué):150 160 165 173 155豺撑。
6烈疚、3 同學(xué)比 4 同學(xué)矮,所以隊(duì)伍不進(jìn)行變化:150 160 165 173 155聪轿。
7爷肝、繼續(xù)比較4、5同學(xué):150 160 165 173 155陆错。
8灯抛、前面的 4 同學(xué)比后面的 5 同學(xué)高,所以交換位置:150 160 165 155 173音瓷。
這樣就完成了第一次的隊(duì)伍規(guī)整对嚼,我們可以看到,進(jìn)行了第一次所有人的從前往后的兩兩對(duì)比绳慎,現(xiàn)在整只隊(duì)伍最高的那個(gè)人已經(jīng)站到了隊(duì)尾纵竖,就像魚吐泡泡一樣,最大的泡泡已經(jīng)浮出了水面杏愤。
繼續(xù)從頭到尾重復(fù)上面的過程靡砌,直到所有的人從前往后站隊(duì)成從小到大∩睿總體的過程就像是(隊(duì)伍從下往上乏奥,過程從前往后):
第一次整理:
155 155 155 155 155 173
173 173 173 173 173 155
160 160 165 165 160 160
165 165 160 160 165 165
150 150 150 150 150 150
第二次整理:
173 173 173 173 173 173
155 155 155 155 165 165
160 160 165 165 155 155
165 165 160 160 160 160
150 150 150 150 150 150
第三次整理:
173 173 173 173 173
165 165 165 165 165
155 155 160 160 160
160 160 155 155 155
150 150 150 150 150
就像這樣摆舟,像魚吐泡泡一樣亥曹,逐漸的整個(gè)隊(duì)伍就站成了從前往后,從大到到小的順序恨诱。站隊(duì)的過程媳瞪,就是前面的同學(xué)和后面的同學(xué)比較,互換位置的過程照宝。班主任就會(huì)很省事……
時(shí)間復(fù)雜度
當(dāng)然蛇受,冒泡排序可以進(jìn)行改進(jìn),增加一個(gè)標(biāo)志位厕鹃,如果一次遍歷中沒有發(fā)生值的交換兢仰,就證明整個(gè)數(shù)列都是有序的乍丈,這樣,最好的情況下就是一開始整個(gè)序列就是有序的把将,所以轻专,最好的情況下,時(shí)間復(fù)雜度是O(n)察蹲。
最壞的情況下请垛,需要反復(fù)遍歷所有的元素,這樣洽议,時(shí)間復(fù)雜度就會(huì)變成O(n^2)宗收。
所以平均時(shí)間復(fù)雜度為O(n^2)。
算法實(shí)現(xiàn)
#coding:utf-8
import numpy as np
def bubble_sort(data):
data_length = len(data)
for i in range(data_length, 0, -1):
for j in range(1, i, 1):
if data[j] < data[j-1]:
data[j], data[j-1] = data[j-1], data[j]
array = np.arange(20)
np.random.shuffle(array)
array = list(array)
print('輸入的數(shù)據(jù): {}'.format(array))
bubble_sort(array)
print('排序之后的數(shù)據(jù):{}'.format(array))
結(jié)果是:
上一篇:寫給媳婦兒的算法(三)——選擇排序
上一篇:寫給媳婦兒的算法(五)——插入排序