小白算法_(1)

前言

筆者屬于算法小白一枚欺栗,本系列文章屬于算法的學習筆記娶牌,也希望能給算法小小白起到些許的指引作用餐曹。如果有算法大佬不小心點了進來虑瀑,只能說一聲抱歉打擾了湿滓。

正文

題目

請實現一個冒泡排序,升序排列舌狗。

原理

  1. 比較相鄰的元素叽奥,如果前面一個比后面一個大,就交換他們兩個痛侍。
  2. 對每一對相鄰元素作同樣的工作朝氓,從開始的一對到結尾的最后一對。這步做完以后主届,最大元素就在隊列尾部赵哲。
  3. 重復以上步驟,找出第二大君丁、第三大的元素等等依次排列在尾部枫夺,直到沒有任何一對數字需要比較。

實現

冒泡排序需要兩層循環(huán)才能實現绘闷,個人建議先梳理清楚一層循環(huán)做了什么事情橡庞,得到了什么結果较坛,最后再加上一層循環(huán)嵌套,思路會更清晰一些毙死。

假設待排序的數組:[6, 4, 2, 1, 8, 3, 7, 9, 5]

我們在一層循環(huán)里面想要將最大的元素放在隊列尾部燎潮,結合算法原理喻鳄,不難寫出以下代碼:

public static void main(String[] args) {
    int[] array = {6, 4, 2, 1, 8, 3, 7, 9, 5};
    for (int j = 0; j < array.length - 1; j++) {
        if (array[j] > array[j + 1]) {
            int tmp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = tmp;
        }
    }
    System.out.println(Arrays.toString(array));
}

得到數組:[4, 2, 1, 6, 3, 7, 8, 5, 9]

分析:

  1. 數組一共9個元素扼倘,現在找到了最大的元素,并且這個元素在隊列尾部除呵。
  2. 接下來我只需要在剩下的8個元素里面找到第二大的元素就好了再菊。

繼續(xù)寫代碼:

public static void main(String[] args) {
    int[] array = {6, 4, 2, 1, 8, 3, 7, 9, 5};
    for (int j = 0; j < array.length - 1; j++) {
        if (array[j] > array[j + 1]) {
            int tmp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = tmp;
        }
    }
    for (int j = 0; j < array.length - 2; j++) {
        if (array[j] > array[j + 1]) {
            int tmp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = tmp;
        }
    }
    System.out.println(Arrays.toString(array));
}

得到數組:[2, 1, 4, 3, 6, 7, 5, 8, 9]

分析:

  1. 仔細觀察兩段 for 循環(huán)代碼,不難發(fā)現唯一的區(qū)別就是array.length - 1array.length - 2颜曾。
  2. 容易想到纠拔,當我們想要在剩余的7個元素里面找到第三大的元素的時候,對應的就是array.length - 3泛豪。抽象出來就是array.length - i稠诲。
  3. 那么我們最終需要減到哪個數字為止呢?很簡單诡曙,對9個元素排序臀叙,只需要進行8次即可
  4. 就這樣价卤,新的一層循環(huán)嵌套已經呼之欲出了劝萤。int i = 1; i < array.length; i++

改進代碼:

public static void main(String[] args) {
    int[] array = {6, 4, 2, 1, 8, 3, 7, 9, 5};
    for (int i = 1; i < array.length; i++) {
        for (int j = 0; j < array.length - i; j++) {
            if (array[j] > array[j + 1]) {
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
    }
    System.out.println(Arrays.toString(array));
}

到這里慎璧,一個完整的冒泡排序就實現了床嫌。

實際上,這并不是最完美的實現胸私,因為如果待排序的數組內部已經有序厌处,比如[1, 2, 3, 4, 5, 6, 7, 8, 9],以上代碼還是會老老實實的依次比對岁疼,盡管它不會交換數據阔涉。因此,我們可以增加一個標記位用于判斷一次比對過程當中是否交換了數據五续,如果沒有洒敏,則代表數組已經有序,直接退出循環(huán)即可疙驾。

最終代碼:

public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    for (int i = 1; i < array.length; i++) {
        boolean exchange = false;
        for (int j = 0; j < array.length - i; j++) {
            if (array[j] > array[j + 1]) {
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
                exchange = true;
            }
        }
        if (!exchange) {
            break;
        }
    }
    System.out.println(Arrays.toString(array));
}

總結

冒泡排序是一個非常簡單的入門級排序凶伙,它具有如下特點:

  1. 時間復雜度是O(n2)。
  2. 空間復雜度是O(1)它碎。
  3. 是一個穩(wěn)定排序函荣。

請深入理解了它的實現以后显押,在純文本編輯的環(huán)境下手撕了它。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末傻挂,一起剝皮案震驚了整個濱河市乘碑,隨后出現的幾起案子,更是在濱河造成了極大的恐慌金拒,老刑警劉巖兽肤,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異绪抛,居然都是意外死亡资铡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門幢码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笤休,“玉大人,你說我怎么就攤上這事症副〉暄牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵贞铣,是天一觀的道長闹啦。 經常有香客問我,道長咕娄,這世上最難降的妖魔是什么亥揖? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮圣勒,結果婚禮上费变,老公的妹妹穿的比我還像新娘。我一直安慰自己圣贸,他們只是感情好挚歧,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吁峻,像睡著了一般滑负。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上用含,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天矮慕,我揣著相機與錄音,去河邊找鬼啄骇。 笑死痴鳄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缸夹。 我是一名探鬼主播痪寻,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼螺句,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橡类?” 一聲冷哼從身側響起蛇尚,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顾画,沒想到半個月后取劫,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亲雪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年勇凭,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义辕。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寓盗,靈堂內的尸體忽然破棺而出灌砖,到底是詐尸還是另有隱情,我是刑警寧澤傀蚌,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布基显,位于F島的核電站,受9級特大地震影響善炫,放射性物質發(fā)生泄漏撩幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一箩艺、第九天 我趴在偏房一處隱蔽的房頂上張望窜醉。 院中可真熱鬧,春花似錦艺谆、人聲如沸榨惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琅催。三九已至,卻和暖如春虫给,著一層夾襖步出監(jiān)牢的瞬間藤抡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工抹估, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缠黍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓棋蚌,卻偏偏與公主長得像嫁佳,于是被迫代替她去往敵國和親挨队。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348