排序算法(一):冒泡排序

冒泡排序是一種通過交換元素位置實現(xiàn)的穩(wěn)定排序方式,其特點是每一輪排序后茁瘦,都會在首端或尾端產(chǎn)生一個已排序元素,就像水泡不斷上浮一樣遍搞,通過多次排序祥款,最終所有元素變得有序清笨。

算法過程

以遞增排序為例,初始集合即為待排序集合刃跛,已排序集合初始為空

  1. 從待排序集合中第一個元素開始向后遍歷集合中元素抠艾,比較與下一個元素值的大小,大于下一個元素值則交換兩個元素位置桨昙,直到待排序集合最后一個元素检号;
  2. 標記待排序集合最后一個元素為已排序;
  3. 重復(fù)步驟 1,2蛙酪,直到待排序集合只有一個元素

演示示例

初始狀態(tài):0 次排序
待排序集合:[6,3,4,0,2,1,8,5,9,7]
已排序集合:[]

初始狀態(tài)為:


根據(jù)算法過程:

  • 步驟一齐苛,從待排序集合中第一個元素開始,比較 6 和 3桂塞,比較大小并交換位置后凹蜂,選擇第二個元素,比較 6 和 4阁危,比較大小并交換位置玛痊,依次遍歷直到待排序集合最后一個元素;
  • 步驟二狂打,標記待排序集合中的最后一個元素為已排序擂煞,即元素 9 標記為已排序,從待排序集合中移除該元素

1 次排序后
待排序集合:[3, 4, 0, 2, 1, 6, 5, 8, 7]
已排序集合:[9]

根據(jù)算法過程步驟三趴乡,待排序集合中不止一個元素对省,所以重復(fù)執(zhí)行步驟一、二:

  • 步驟一浙宜,遍歷待排序集合官辽,選擇第一個元素,比較 3,4粟瞬,比較大小后,選擇第二個元素萤捆,比較 4,0裙品,比較大小并交換位置俗批,選擇第三個元素,比較4,2市怎,依次遍歷直到集合最后一個元素岁忘;
  • 步驟二,標記最后一個元素為已排序

2 次排序后
待排序集合:[3, 0, 2, 1, 4, 5, 6, 7]
已排序集合:[8, 9]


...
...
...

9 次排序后
待排序集合:[0]
已排序集合:[1, 2, 3, 4, 5, 6, 7, 8, 9]

觀察以上過程可知区匠,每次排序后會有一個元素變?yōu)橐雅判蚋上瘢从幸粋€元素處于正確的位置上。所以 N 個元素的序列驰弄,經(jīng)過 N-1 次排序后麻汰,則有 N-1 個元素處于已排序狀態(tài),則剩下的一個元素不再需要進行排序戚篙。

算法示例

def bubbleSort(arr):
    for i in range(1, len(arr)):  # 迭代次數(shù)
        flag = True
        for j in range(len(arr) - i):  # 遍歷比較每個元素與下一個元素值大小
            if arr[j] > arr[j+1]:
                arr[j],arr[j+1] = arr[j+1],arr[j]
                flag = False
        if flag:
            break
代碼分析 :
  • 以上代碼中五鲫,第一層循環(huán)為需要進行的迭代次數(shù),元素個數(shù)為 N 的集合岔擂,最多需要 N-1 次迭代即可確定 N-1 個元素的位置位喂,即完成排序;
  • 第二層循環(huán)為待排序集合中元素的遍歷比較大小操作乱灵,隨著迭代次數(shù)的增加塑崖,待排序元素個數(shù)減少;
  • 代碼中增加了一個 flag 標志變量痛倚,用于標志排序結(jié)束狀態(tài)弃舒。若某一輪迭代中,待排序集合中元素遍歷過程中状原,沒有發(fā)生元素位置交換操作聋呢,則該待排序集合為有序的,排序算法結(jié)束颠区。

算法分析

冒泡排序是一種穩(wěn)定排序算法削锰,排序過程中,如果兩個元素值相等毕莱,則不交換元素位置器贩。對于 N 個元素的序列:

  • 最壞情況下,當(dāng)序列為逆序時朋截,需要 N-1 次迭代才能結(jié)束排序過程蛹稍, 每一次遍歷都比較并交換待排序集合中所有元素位置,即第 i 次迭代部服,遍歷的元素個數(shù)為 N-i唆姐,所以最壞情況下,算法的交換復(fù)雜度和比較復(fù)雜度都為 O(n^2) ;
  • 最好情況下廓八,當(dāng)序列為已排序時奉芦,第一次迭代即可結(jié)束排序過程赵抢,第一次遍歷元素個數(shù)為 N 次,交換次數(shù)為 0声功,所以最好情況下烦却,算法的比較復(fù)雜度為 O(n) ,交換復(fù)雜度為 0先巴。

算法執(zhí)行過程中其爵,不需要申請額外的序列空間來保存臨時元素,屬于原地排序方式伸蚯,所以算法的空間復(fù)雜度為 O(1) 摩渺。

github 鏈接:冒泡排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市朝卒,隨后出現(xiàn)的幾起案子证逻,更是在濱河造成了極大的恐慌,老刑警劉巖抗斤,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囚企,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑞眼,警方通過查閱死者的電腦和手機龙宏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伤疙,“玉大人银酗,你說我怎么就攤上這事⊥较瘢” “怎么了黍特?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锯蛀。 經(jīng)常有香客問我灭衷,道長,這世上最難降的妖魔是什么旁涤? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任翔曲,我火速辦了婚禮,結(jié)果婚禮上劈愚,老公的妹妹穿的比我還像新娘瞳遍。我一直安慰自己,他們只是感情好菌羽,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布掠械。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪份蝴。 梳的紋絲不亂的頭發(fā)上犁功,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天氓轰,我揣著相機與錄音婚夫,去河邊找鬼。 笑死署鸡,一個胖子當(dāng)著我的面吹牛案糙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靴庆,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼时捌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炉抒?” 一聲冷哼從身側(cè)響起奢讨,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焰薄,沒想到半個月后拿诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡塞茅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年亩码,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野瘦。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡描沟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞭光,到底是詐尸還是另有隱情吏廉,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布惰许,位于F島的核電站席覆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啡省。R本人自食惡果不足惜娜睛,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卦睹。 院中可真熱鬧畦戒,春花似錦、人聲如沸结序。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垃环,卻和暖如春邀层,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遂庄。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工寥院, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涛目。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓秸谢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霹肝。 傳聞我的和親對象是個殘疾皇子估蹄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容