02《算法入門教程》冒泡排序

1. 前言

本節(jié)內(nèi)容是排序算法系列之一:冒泡排序赚哗,主要講解了冒泡排序的主體思路汇跨,選取了一個(gè)待排序的數(shù)字列表對冒泡排序算法進(jìn)行了演示脊另,給出了冒泡排序算法的 Java 代碼實(shí)現(xiàn)戚绕,幫助大家可以更好地理解冒泡排序算法塘娶。

2. 什么是冒泡排序归斤?

冒泡排序(Bubble Sort),是計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域中較為簡單的一種排序算法刁岸。

它重復(fù)地遍歷要排序的序列脏里,會依次比較兩個(gè)相鄰的元素,如果發(fā)現(xiàn)兩個(gè)相鄰的元素順序錯(cuò)誤就把它們交換過來虹曙。遍歷序列的工作會重復(fù)地進(jìn)行直到?jīng)]有相鄰的元素需要交換位置迫横,也就是說序列的排序工作已經(jīng)完成。

冒泡排序的算法名稱的由來就是因?yàn)樵谂判虻倪^程中酝碳,按照排序規(guī)則(升序或者降序)矾踱,越小或者越大的元素會經(jīng)過交換之后慢慢 “浮” 到序列的頂端,就如同水中的氣泡一樣最終會浮到頂端一樣疏哗,所以起名為 “冒泡排序”呛讲。

3. 冒泡排序過程

在介紹完冒泡排序之后,我們一起來看一下冒泡排序的實(shí)現(xiàn)步驟具體是什么樣的吧返奉。這里我們假設(shè)待排序的序列為 [9,2,11,7,12,5]贝搁,我們按照從小到大的序列進(jìn)行排序。

3.1 算法步驟

  1. 步驟 1:

比較待排序序列中相鄰的兩個(gè)元素芽偏,如果發(fā)現(xiàn)左邊的元素比右邊的元素大雷逆,則交換這兩個(gè)元素;

  1. 步驟 2:

每一對相鄰的兩個(gè)元素重復(fù)步驟 1 的動作污尉,從左至右依次執(zhí)行膀哲;

  1. 步驟 3:

針對待排序序列中除了最右邊的一個(gè)元素之外,重復(fù)步驟 1被碗, 步驟 2 的工作某宪;

  1. 步驟 4:

持續(xù)以上步驟 1步驟 2蛮放, 步驟 3 的工作缩抡,每重復(fù)一次需要排序的序列中少一個(gè)最右邊的元素,直到?jīng)]有任何一對數(shù)字需要比較排序包颁。

其實(shí)瞻想,上面的步驟 2 每執(zhí)行一次,都有一個(gè)排序好的數(shù)字放到需要排序的序列的最右邊娩嚼,這樣一直重復(fù)蘑险,可以完成最開始的整個(gè)待排序序列的排序工作。接下來岳悟,讓我們用上面的待排序數(shù)字隊(duì)列 [9,2,11,7,12,5] 進(jìn)行整個(gè)算法步驟的排序演示工作佃迄。

3.2 算法演示

按照排序步驟泼差,首先我們會比較待排序序列中(9,2)這一對需要排序的序列,按照從小到大進(jìn)行排序呵俏,需要交換位置堆缘,形成序列(2,9),如下:


5edf57230966d44810610099.jpg

接著普碎,我們調(diào)用步驟 2吼肥,重復(fù)每一對的排序工作,整個(gè)過程如下:

5edf57340901f6fa10540492.jpg

步驟 2 會依次比較待排序序列中相鄰的兩個(gè)元素麻车,按照如上過程一樣缀皱。當(dāng)相鄰的兩個(gè)元素已經(jīng)是排序好的時(shí)候,無需交換順序动猬,否則交換相鄰兩個(gè)元素的順序啤斗。

Tips: 步驟 2 每執(zhí)行一次都會有一個(gè)元素排序好,就是所謂的冒泡的過程赁咙,按照從小到大的順序排列時(shí)钮莲,每次都會有一個(gè)最大的元素排序好,放在待排序序列的最右邊彼水。

完成步驟 2 之后臂痕,說明我們已經(jīng)把最大的一個(gè)元素 12 排序好啦,接下來我們只需要對序列 [2,9,7,11,5] 進(jìn)行排序即可猿涨,就如 步驟 3 描述一下,然后重復(fù) 步驟 1姆怪, 步驟 2 中的工作叛赚,具體過程執(zhí)行如下:
[圖片上傳失敗...(image-d29333-1651544329177)]
我們發(fā)現(xiàn)當(dāng)我們執(zhí)行 步驟 3 之后,之前的待排序隊(duì)列 [2,9,7,11,5] 中的最大的一個(gè)元素 11 又已經(jīng)排序好啦稽揭,接下來我們只需要調(diào)用 步驟 4 的工作俺附,重復(fù)之前 步驟 1步驟 2溪掀, 步驟 3事镣,這里我們就不在演示,只是重復(fù)性的進(jìn)行排序工作揪胃,每執(zhí)行一次 步驟 4璃哟,就已經(jīng)把一個(gè)元素排序好,待排序的序列中就減少了一個(gè)序列喊递,每次會有一個(gè)排序好的數(shù)字和一個(gè)剩下的待排序數(shù)列随闪。其實(shí),整個(gè)過程如下:

5edf57ad091d48c508920479.jpg

從上面的示例可以看出骚勘,其實(shí)整個(gè)冒泡排序的過程铐伴,每次都會把最大的一個(gè)數(shù)字排序出來撮奏,放在整個(gè)序列的最右邊,重復(fù)執(zhí)行整個(gè)過程当宴,直到整個(gè)序列中已經(jīng)沒有需要排序的數(shù)值了畜吊。

4. Java 代碼實(shí)現(xiàn)

在說明冒泡排序的整個(gè)過程之后,接下來户矢,我們看看如何用 Java 代碼實(shí)現(xiàn)冒泡排序算法玲献。

import java.util.Arrays;

public class BubbleSort {

    public static void main(String[] args) {
        
        //初始化需要排序的數(shù)組
        int array[] = {9,2,11,7,12,5};
        
        //對需要排序的數(shù)組進(jìn)行排序
        for (int i=1; i<array.length; i++){
            
            //針對待排序序列中除了已經(jīng)排序好的元素之外,重復(fù)排序工作
            for(int j=0;j<array.length-i;j++){
                
                //當(dāng)相鄰兩個(gè)元素需要交換時(shí)逗嫡,交換相鄰的兩個(gè)元素
                if(array[j]>array[j+1]){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        //打印出排序好的序列
        System.out.println(Arrays.toString(array));
    }

}

運(yùn)行結(jié)果如下:

[2, 5, 7, 9, 11, 12]

代碼中的第 8 行初始化一個(gè)需要排序的數(shù)組青自,后面按照從小到大的排序規(guī)則,實(shí)現(xiàn)了數(shù)組的排序驱证。第 11 行是外層循環(huán)延窜,不斷地重復(fù)排序工作。第 14 行是內(nèi)層循環(huán)抹锄,不斷地實(shí)現(xiàn)每一次 “冒泡” 逆瑞,將最大的一個(gè)元素找出。第 17 至第 21 行實(shí)現(xiàn)當(dāng)相鄰兩個(gè)元素需要交換時(shí)伙单,交換相鄰的兩個(gè)元素的功能获高。第 25 行打印出排序好的數(shù)組。

5. 小結(jié)

本節(jié)主要學(xué)習(xí)了冒泡排序算法吻育,在學(xué)完本節(jié)課程之后念秧,需要熟悉冒泡排序的算法流程,知道冒泡排序算法的實(shí)現(xiàn)思路布疼,可以自己用代碼實(shí)現(xiàn)冒泡排序算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摊趾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子游两,更是在濱河造成了極大的恐慌砾层,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贱案,死亡現(xiàn)場離奇詭異肛炮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宝踪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門侨糟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘩燥,你說我怎么就攤上這事粟害。” “怎么了颤芬?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵悲幅,是天一觀的道長套鹅。 經(jīng)常有香客問我,道長汰具,這世上最難降的妖魔是什么卓鹿? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮留荔,結(jié)果婚禮上吟孙,老公的妹妹穿的比我還像新娘。我一直安慰自己聚蝶,他們只是感情好杰妓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碘勉,像睡著了一般巷挥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上验靡,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天倍宾,我揣著相機(jī)與錄音,去河邊找鬼胜嗓。 笑死高职,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辞州。 我是一名探鬼主播怔锌,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼变过!你這毒婦竟也來了产禾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤牵啦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后妄痪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哈雏,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年衫生,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裳瘪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罪针,死狀恐怖彭羹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泪酱,我是刑警寧澤派殷,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布还最,位于F島的核電站,受9級特大地震影響毡惜,放射性物質(zhì)發(fā)生泄漏拓轻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一经伙、第九天 我趴在偏房一處隱蔽的房頂上張望扶叉。 院中可真熱鬧,春花似錦帕膜、人聲如沸枣氧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽达吞。三九已至,卻和暖如春危纫,著一層夾襖步出監(jiān)牢的瞬間宗挥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工种蝶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留契耿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓螃征,卻偏偏與公主長得像搪桂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子盯滚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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

  • 上節(jié)我們分別通過案例迷宮和八皇后親自體驗(yàn)了遞歸回溯算法的思想,本節(jié)我們學(xué)習(xí)常見八大算法之一的冒泡排序算法,親自感受...
    會上樹的程序猿閱讀 424評論 0 0
  • 一般排序的常用方法有:冒泡法踢械、插入法、選擇法魄藕、快速排序内列、歸并排序、桶排序背率、希爾排序话瞧、堆排序、基數(shù)排序寝姿、外部排序等交排。...
    雨落失憶之城閱讀 188評論 0 0
  • 1. 前言 本節(jié)內(nèi)容是排序算法系列之一:插入排序,主要講解了插入排序的主體思路饵筑,選取了一個(gè)待排序的數(shù)字列表對插入排...
    木子教程閱讀 131評論 0 0
  • 冒泡排序插入排序插入排序和冒泡排序分析 冒泡排序 冒泡排序(英語:Bubble Sort埃篓,臺灣另外一種譯名為:泡沫...
    六尺帳篷閱讀 2,167評論 0 9
  • 上節(jié)我們學(xué)習(xí)了選擇排序算法,本節(jié)我們繼續(xù)學(xué)習(xí)相關(guān)剩余算法如我們本節(jié)要學(xué)習(xí)的插入排序,直接入正題,先來介紹下什么是插...
    會上樹的程序猿閱讀 285評論 0 0