[算法學習筆記]——冒泡霸琴、插入椒振、選擇排序算法

冒泡排序

    public static int[] sortArray(int[] arr) {
        int temp;
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true; // 優(yōu)化,標記是否有數(shù)據(jù)交換
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = false; // 數(shù)據(jù)交換了
                }
            }
            if (flag) {
                break; // 如果沒有數(shù)據(jù)交換說明數(shù)組已經(jīng)是有序的了梧乘,提前退出
            }
        }
        return arr;
    }
  • 思路
    • 對長度為n的數(shù)組遍歷n次澎迎,每次遍歷依次比較相鄰的兩個元素,如果大小關系不符合要求,就交換它倆的位置夹供。這樣每次遍歷都能保證至少一個元素移動到了它應該在的位置辑莫。
    • 注意:以從小到大排序為例,第一次循環(huán)后數(shù)組末尾位置的元素就是最大值罩引,第二次倒數(shù)第二位的元素也是第二大的各吨,依次類推...所以代碼中內(nèi)層循環(huán)的界限是在一直縮小的。
    • 優(yōu)化:用一個flag標記當次循環(huán)中是否有元素進行了交換袁铐。如果沒有任何元素發(fā)生了交換揭蜒,則證明數(shù)組已經(jīng)是有序的了,可以直接跳出循環(huán)剔桨,結束排序屉更。
  • 分析
    • 穩(wěn)定性:相鄰元素大小相等時不做交換,所以不會改變大小相等的元素的順序洒缀,是穩(wěn)定的排序算法瑰谜。
    • 空間復雜度:O(1),只在交換數(shù)據(jù)時需要一塊常數(shù)級的臨時空間树绩,是原地排序算法萨脑。
    • 時間復雜度:最好的情況,數(shù)組本來就是有序的饺饭,時間復雜度為O(n)渤早。最壞的情況,數(shù)組是倒序的瘫俊,需要n次冒泡鹊杖,時間復雜度為O(n2)。經(jīng)過不嚴格的簡單推導扛芽,平均時間復雜度還是O(n2)骂蓖。

插入排序

    public static int[] sortArray(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int value = arr[i]; // 記錄此次循環(huán)要插入的元素
            int j = i - 1;
            for (; j >= 0; j--) {
                if (arr[j] > value) {
                    arr[j + 1] = arr[j]; // 如果已排序的元素沒有待插入元素大,就向后挪一位
                } else {
                    break; // 找到插入位置川尖,結束循環(huán)
                }
            }
            arr[j + 1] = value; // 將元素插入找到的位置
        }
        return arr;
    }
  • 思路
    • 將數(shù)組分為兩個區(qū)間登下,已排序和未排序。已排序區(qū)間最開始就有一個元素空厌,也就是數(shù)組的第一個元素庐船。然后取未排序區(qū)間的元素,在已排序區(qū)間中找到自己的位置嘲更,插進去。直到未排序區(qū)間為空揩瞪。
    • 代碼中赋朦,以從小到大排序為例,下標i前的元素為已排序元素,i及i之后的元素為未排序元素宠哄。每次取一個未排序的元素壹将,倒著去比較已排序元素,如果發(fā)現(xiàn)比某個元素小毛嫉,就插在這個元素之前诽俯。
  • 分析
    • 穩(wěn)定性:比較插入時,如果元素相等承粤,可以將未排序的元素插在已排序的元素后邊暴区,可以做到保持原有順序不變,是穩(wěn)定的排序算法辛臊。
    • 空間復雜度:O(1)仙粱,不需要額外的存儲空間,是原地排序算法彻舰。
    • 時間復雜度:最好的情況伐割,數(shù)組本來就是有序的,如果從尾到頭遍歷有序部分刃唤,查找插入位置隔心,每次循環(huán)只需要比較一次就能確定,時間復雜度為O(n)尚胞。最壞的情況济炎,數(shù)組是倒序的,每次查找都要把元素插在有序部分的開頭辐真,需要多次移動元素须尚,時間復雜度為O(n2)。往數(shù)組中插入一個數(shù)據(jù)的平均時間復雜度是O(n)侍咱,我們相當于循環(huán)n次執(zhí)行插入操作耐床,所以平均時間復雜度為O(n2)。

冒泡排序 vs 插入排序

  • 它們的穩(wěn)定性和時間楔脯、空間復雜度都相同撩轰,但如果要追求極致,可以發(fā)現(xiàn)冒泡排序在交換元素時需要3個賦值操作昧廷,而插入排序只需要一個堪嫂。當數(shù)據(jù)量很大的時候這點微小的差距累積起來就可以讓插入排序勝過冒泡排序。
  • 插入排序的優(yōu)化:參考 五分鐘學會一個高難度算法:希爾排序

選擇排序

  • 思路
    • 類似插入排序木柬,以從小到大排序為例皆串,每次遍歷找到未排序部分的最小值放在已排序部分的末尾。
  • 分析
    • 穩(wěn)定性:具體實現(xiàn)時會將最小值元素與要放在已排序部分末尾那個位置的元素交換位置眉枕。經(jīng)過多次交換后會破壞穩(wěn)定性恶复。
    • 空間復雜度時間復雜度與冒泡排序和插入排序是一樣的怜森。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谤牡,隨后出現(xiàn)的幾起案子副硅,更是在濱河造成了極大的恐慌,老刑警劉巖翅萤,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恐疲,死亡現(xiàn)場離奇詭異,居然都是意外死亡套么,警方通過查閱死者的電腦和手機培己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來违诗,“玉大人漱凝,你說我怎么就攤上這事≈畛伲” “怎么了茸炒?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阵苇。 經(jīng)常有香客問我壁公,道長,這世上最難降的妖魔是什么绅项? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任紊册,我火速辦了婚禮,結果婚禮上快耿,老公的妹妹穿的比我還像新娘囊陡。我一直安慰自己,他們只是感情好掀亥,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布撞反。 她就那樣靜靜地躺著,像睡著了一般搪花。 火紅的嫁衣襯著肌膚如雪遏片。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天撮竿,我揣著相機與錄音吮便,去河邊找鬼。 笑死幢踏,一個胖子當著我的面吹牛髓需,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惑折,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼授账,長吁一口氣:“原來是場噩夢啊……” “哼枯跑!你這毒婦竟也來了惨驶?” 一聲冷哼從身側響起白热,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粗卜,沒想到半個月后屋确,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡续扔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年攻臀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纱昧。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡刨啸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出识脆,到底是詐尸還是另有隱情设联,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布灼捂,位于F島的核電站离例,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悉稠。R本人自食惡果不足惜宫蛆,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望的猛。 院中可真熱鬧耀盗,春花似錦、人聲如沸卦尊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猫牡。三九已至胡诗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淌友,已是汗流浹背煌恢。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留震庭,地道東北人瑰抵。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像器联,于是被迫代替她去往敵國和親二汛。 傳聞我的和親對象是個殘疾皇子婿崭,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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