排序算法總結(jié)

冒泡排序

對(duì)于一個(gè)數(shù)組來說狈惫,每次相鄰兩個(gè)元素進(jìn)行比較筷凤,如果第二個(gè)元素小于第一個(gè)元素就進(jìn)行交換(升序排序的情況),這樣子每次循環(huán)完畢后忙干,待排序數(shù)組里面最大的值都會(huì)移動(dòng)到末尾,下次循環(huán)就可以不用考慮判斷末尾的情況了浪藻。
時(shí)間復(fù)雜度:O(n方)

    public void bubbleSort(int[] q) {
        for(int i = 1; i < q.length; i++) {
            for(int j = 0; j < q.length - i; j++) {
                if(q[j] > q[j + 1]) {
                    int temp = q[j];
                    q[j] = q[j + 1];
                    q[j + 1] = temp;
                }
            }
        }
    }

選擇排序

在第i次循環(huán)中捐迫,每次從待排序的數(shù)組中選擇一個(gè)最小的元素,放到第i個(gè)位置爱葵。那么循環(huán)結(jié)束后就可以得到一個(gè)升序數(shù)組了
時(shí)間復(fù)雜度:O(n方)

    public static void selectSort(int[] q) {
        for(int i = 0; i < q.length - 1; i++) {
            int min = i;
            
            for(int j = i + 1; j < q.length; j++) {
                if(q[j] < q[min]) {
                    min = j;
                }
            }
            if(i != min) {
                int temp = q[i];
                q[i] = q[min];
                q[min] = temp;
            }
            
        }
        
    }

插入排序

每次循環(huán)施戴,前i個(gè)位置構(gòu)成的數(shù)組都是有序的數(shù)組,即每次都會(huì)把新的元素與他之前的元素進(jìn)行比較萌丈,如果新元素小就互換位置赞哗,while循環(huán)會(huì)一直換直到新元素到了該到的位置,這樣子新的數(shù)組又是一個(gè)有序數(shù)組辆雾,然后在去把下一個(gè)元素插入進(jìn)來肪笋。雖然名字是插入排序,但是因?yàn)槊看味家c前面一個(gè)進(jìn)行比較再互換度迂,所以還是穩(wěn)定的排序藤乙。
時(shí)間復(fù)雜度:O(n方)

    public void insertSort(int[] q) {
        for(int i = 1; i < q.length; i++) {
            int j = i;
            while(q[j] < q[j - 1] && j > 0) {
                int temp = q[j];
                q[j] = q[j - 1];
                q[j - 1] = temp;
                j --;
            }
        }
        
    }

歸并排序

分治法是把一個(gè)問題分成n個(gè)子問題去看待。要對(duì)一個(gè)數(shù)組排序惭墓,可以把它分成兩個(gè)同等規(guī)模的數(shù)組坛梁,這兩個(gè)數(shù)組分別排序完后再合并成一個(gè)有序數(shù)組,而兩個(gè)數(shù)組可以分為四個(gè)同等規(guī)模的數(shù)組腊凶,一直分到最后一個(gè)數(shù)組只有兩個(gè)元素划咐。合并的過程就是申請(qǐng)一個(gè)新數(shù)組毅人,然后雙指針,哪個(gè)數(shù)組指向的小就放到新數(shù)組中尖殃,最后有個(gè)數(shù)組會(huì)有剩下來的值丈莺,直接放到新數(shù)組的末尾。

    public void merge(int []q, int l, int r) {
        if(l >= r) return;
        
        int mid =  ((r - l) >> 1) + l;
        merge(q, l, mid);  
        merge(q, mid + 1, r);
        
        int k = 0;
        int i = l;
        int j = mid + 1;
        int []temp = new int[q.length];
        while(i <= mid && j <= r) {
            if(q[i] <= q[j]) {
                temp[k ++ ] = q[i ++ ];
            }else {
                temp[k ++ ] = q[j ++ ];
            }
        }
        while(i <= mid) temp[k ++ ] = q[i ++ ];
        while(j <= r) temp[k ++ ] = q[j ++ ];
        for(i = l, j = 0; i <= r; i++, j++) {
            q[i] = temp[j];
        }
    }

快速排序

選擇一個(gè)最中間的元素當(dāng)做基準(zhǔn)送丰,然后雙指針指向頭和尾缔俄,如果頭指針的元素小于中間值就繼續(xù)往后移動(dòng),如果尾指針的元素大于中間值就往前移動(dòng)器躏,當(dāng)他們兩個(gè)都停下來的時(shí)候俐载,如果頭指針小于尾指針的位置,那么就交換兩個(gè)位置的元素登失,然后一直循環(huán)直到頭指針大于等于尾指針的位置遏佣。一次快排就結(jié)束了,這個(gè)時(shí)候j這個(gè)位置左邊的元素都比他小揽浙,右邊的元素都比他大状婶,分別進(jìn)行兩次快排。
時(shí)間復(fù)雜度:O(nlogn)馅巷,正常情況下快排的速度比歸并還快膛虫,但是快排也是一種不穩(wěn)定的排序,不穩(wěn)定的排序一般有四種钓猬,快希選堆(快速排序稍刀,希爾排序,選擇排序敞曹,堆排序)

    public void quickSort(int[] q, int l, int r) {
        if(l >= r)
            return;
        int i = l - 1;
        int j = r + 1;
        int x = q[l + r >> 1];
        while(i < j) {
            do i++; while(q[i] < x);
            do j--; while(q[j] > x);
            if(i < j) {
                int temp = q[i];
                q[i] = q[j];
                q[j] = temp;
                
            }
        }
        quickSort(q, l, j);
        quickSort(q, j + 1, r);
        
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账月,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澳迫,更是在濱河造成了極大的恐慌局齿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纲刀,死亡現(xiàn)場離奇詭異项炼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)示绊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暂论,“玉大人面褐,你說我怎么就攤上這事∪√ィ” “怎么了展哭?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵湃窍,是天一觀的道長。 經(jīng)常有香客問我匪傍,道長您市,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任役衡,我火速辦了婚禮茵休,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘手蝎。我一直安慰自己榕莺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布棵介。 她就那樣靜靜地躺著钉鸯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邮辽。 梳的紋絲不亂的頭發(fā)上唠雕,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音吨述,去河邊找鬼及塘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锐极,可吹牛的內(nèi)容都是我干的笙僚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灵再,長吁一口氣:“原來是場噩夢啊……” “哼肋层!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翎迁,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤栋猖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汪榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒲拉,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年痴腌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雌团。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡士聪,死狀恐怖锦援,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剥悟,我是刑警寧澤灵寺,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布曼库,位于F島的核電站,受9級(jí)特大地震影響略板,放射性物質(zhì)發(fā)生泄漏毁枯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一叮称、第九天 我趴在偏房一處隱蔽的房頂上張望种玛。 院中可真熱鬧,春花似錦颅拦、人聲如沸蒂誉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽右锨。三九已至,卻和暖如春碌秸,著一層夾襖步出監(jiān)牢的瞬間绍移,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工讥电, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹂窖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓恩敌,卻偏偏與公主長得像瞬测,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纠炮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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