小白算法_(2)

前言

筆者屬于算法小白一枚,本系列文章屬于算法的學習筆記,也希望能給算法小小白起到些許的指引作用涡相。如果有算法大佬不小心點了進來,只能說一聲抱歉打擾了剩蟀。

正文

題目

請實現(xiàn)一個選擇排序催蝗,升序排列。

原理

  1. 在未排序隊列中找到最小元素育特,放在排序隊列的頭部丙号。
  2. 再從剩余未排序元素中繼續(xù)尋找最小元素,然后放到已排序隊列的尾部缰冤。
  3. 重復第二步犬缨,直到所有元素均排序完畢。

實現(xiàn)

選擇排序需要兩層循環(huán)才能實現(xiàn)棉浸,個人建議先梳理清楚一層循環(huán)做了什么事情怀薛,得到了什么結果,最后再加上一層循環(huán)嵌套涮拗,思路會更清晰一些乾戏。

假設待排序的數(shù)組:[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};
    // 假設最小的元素索引是0
    int minIndex = 0;
    for (int j = 1; j < array.length; j++) {
        // 找到了更小的元素鼓择,更新索引
        if (array[j] < array[minIndex]) {
            minIndex = j;
        }
    }
    // 將最小的元素放置在索引0
    if (minIndex != 0) {
        int tmp = array[minIndex];
        array[minIndex] = array[0];
        array[0] = tmp;
    }
    System.out.println(Arrays.toString(array));
}

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

分析:

  1. 經(jīng)過一層循環(huán),我們選擇出了最小的元素就漾,并且將它放在了隊列頭部呐能。
  2. 接下來我們需要找到第二小的元素,將它放在隊列的第二個位置。
  3. 此時隊列頭部位置已經(jīng)放置了最小元素摆出,我們從第二個位置開始選擇朗徊。

繼續(xù)寫代碼:

public static void main(String[] args) {
    int[] array = {6, 4, 2, 1, 8, 3, 7, 9, 5};
    // 假設最小的元素索引是0
    int minIndex = 0;
    for (int j = 1; j < array.length; j++) {
        // 找到了更小的元素,更新索引
        if (array[j] < array[minIndex]) {
            minIndex = j;
        }
    }
    // 將最小的元素放置在索引0
    if (minIndex != 0) {
        int tmp = array[minIndex];
        array[minIndex] = array[0];
        array[0] = tmp;
    }
    // 假設最小的元素索引是1
    minIndex = 1;
    for (int j = 2; j < array.length; j++) {
        // 找到了更小的元素偎漫,更新索引
        if (array[j] < array[minIndex]) {
            minIndex = j;
        }
    }
    // 將最小的元素放置在索引1
    if (minIndex != 1) {
        int tmp = array[minIndex];
        array[minIndex] = array[1];
        array[1] = tmp;
    }
    System.out.println(Arrays.toString(array));
}

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

分析:

  1. 仔細觀察兩段代碼爷恳,不難發(fā)現(xiàn):
    • minIndex = 0 的時候,循環(huán)從 1 開始象踊,最終交換 minIndex 和 0 位置上的元素温亲。
    • minIndex = 1 的時候,循環(huán)從 2 開始杯矩,最終交換 minIndex 和 1 位置上的元素栈虚。
  2. 可以推測:當 minIndex = i 的時候,循環(huán)從 i+1 開始史隆,最終交換 minIndex 和 i 位置上的元素魂务。
  3. 那么我們最終需要進行多少次元素的選擇呢?很簡單泌射,對9個元素排序粘姜,只需要進行8次即可
  4. 就這樣魄幕,新的一層循環(huán)嵌套已經(jīng)呼之欲出了相艇。int i = 0; i < array.length - 1; i++

改進代碼:

public static void main(String[] args) {
    int[] array = {6, 4, 2, 1, 8, 3, 7, 9, 5};
    for (int i = 0; i < array.length - 1; i++) {
        // 假設最小的元素索引是i
        int minIndex = i;
        for (int j = i + 1; j < array.length; j++) {
            // 找到了更小的元素纯陨,更新索引
            if (array[j] < array[minIndex]) {
                minIndex = j;
            }
        }
        // 將最小的元素放置在索引i
        if (minIndex != i) {
            int tmp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = tmp;
        }
    }
    System.out.println(Arrays.toString(array));
}

到這里,一個完整的選擇排序就實現(xiàn)了留储。

總結

選擇排序是一個非常簡單的入門級排序翼抠,它具有如下特點:

  1. 時間復雜度是O(n2),
  2. 空間復雜度是O(1)获讳。
  3. 是一個不穩(wěn)定排序阴颖。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末丐膝,一起剝皮案震驚了整個濱河市量愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帅矗,老刑警劉巖偎肃,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浑此,居然都是意外死亡累颂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紊馏,“玉大人料饥,你說我怎么就攤上這事≈旒啵” “怎么了岸啡?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赫编。 經(jīng)常有香客問我巡蘸,道長,這世上最難降的妖魔是什么沛慢? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任赡若,我火速辦了婚禮,結果婚禮上团甲,老公的妹妹穿的比我還像新娘逾冬。我一直安慰自己,他們只是感情好躺苦,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布身腻。 她就那樣靜靜地躺著,像睡著了一般匹厘。 火紅的嫁衣襯著肌膚如雪嘀趟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天愈诚,我揣著相機與錄音她按,去河邊找鬼。 笑死炕柔,一個胖子當著我的面吹牛酌泰,可吹牛的內容都是我干的。 我是一名探鬼主播匕累,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陵刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欢嘿?” 一聲冷哼從身側響起衰琐,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炼蹦,沒想到半個月后羡宙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡框弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年辛辨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗搞,死狀恐怖指攒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情僻焚,我是刑警寧澤允悦,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站虑啤,受9級特大地震影響隙弛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜狞山,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一全闷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萍启,春花似錦总珠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驳遵,卻和暖如春淫奔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堤结。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工唆迁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竞穷。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓媒惕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親来庭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359