算法-常見排序

冒泡排序

以升序來講鄙币,我們需要把最小的一個數(shù)通過換位置的方式調(diào)到最第一個,那么第二小的數(shù)調(diào)到第二個位置剩拢。每次我們都從最后的一個數(shù)arr.lenth - 1進行相鄰比較大小糯俗,小的往前調(diào),調(diào)動至位置i, i從0開始

//排序的時間復(fù)雜度n*n   個人覺得(n-1)!更為精確
public static void orderByBubble(int a[]) {
            //先把前面的數(shù)排好.
        for(int i = 0 ; i < a.length - 1 ; i++) { 
            //從最后一個數(shù)開始往前冒泡.
            for(int j = a.length - 1 ; j > i; j--) {
                //每一輪調(diào)換最小的數(shù)到最前面》
                if(a[j] < a[j-1]) {
                    int temp = a[j];
                    a[j] = a[j - 1];
                    a[j - 1] = temp;
                }
            }
        }
}

選擇排序

選擇排序比較簡單肄程,每次從第arr.lenth - i 個數(shù)中找到一個最大或者最小的數(shù)锣吼,并把該數(shù)放到第i個位置

      /**
     * 每次選擇一個最小的數(shù)放在對應(yīng)的i位置.
     * 選擇排序.n*n
     * @param a
     */
    public static void orderBySelect(int a[]) {

        //這個代表第幾個數(shù)需要排序.最后n - 1(最后一個)個數(shù)是不需要排序的,
        for(int i = 0 ; i < a.length - 1; i++) {
            int min = a[i];
            for(int j = i + 1 ; j < a.length ; j++ ) {
                if(min > a[j]) {
                    min = a[j];
                }
            }
            a[i] = min; //第i個數(shù)的序已經(jīng)排好.
        }
    }

直接插入排序

每次將一個無序的數(shù)a[i + 1]插入到一個有序的數(shù)組a[0] ~ a[i]之間蓝厌,并且對該數(shù)組排序.

     /** 
     * 直接插入排序. n
     * @param a
     */
    public static void orderByDirectInsert(int a[]) {
        for(int i = 1 ; i < a.length ; i++) {
        // 在有序的數(shù)組里互換位置把己調(diào)整到合適的位置.
            for(int j = i; j > 0 ; j--) { 
                
        //if(a[n] > a[n - 1] && a[n] < a[n + 1])達到這個條件我們才說OK.終止循環(huán).
                //如果前面一個數(shù)要大玄叠,那么我們跟前面一個數(shù)換位置
                if(a[j - 1] > a[j]) {
                    int temp = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = temp;
                }
            }           
        }
    }

快速排序

快速排序,又名挖坑填數(shù)

/**
     * 時間復(fù)雜度n*logn, 空間復(fù)雜度logn
     * 快速排序》,這里就以a[0]為參照.任意數(shù)組中的元素為參照. 挖坑填數(shù).
     * @param a
     * @param l 初始值通常為0
     * @param r 初始值通常為a.length 可以針對某個區(qū)間排序.
     */
    public static void orderByQuick(int a[],int l,int r) {
        if(a == null) {
            throw new IllegalArgumentException("a[] == null exception");
        }
                
        if( l  < r) {
            //x只是個參考基數(shù).后面的動作中a[l]最終被放在a[i]上.
            int i = l,j = r,x = a[l];
            while(i < j) {
                //這表示有一個數(shù)比x大了,退出循環(huán)的條件拓提,是找到一個比X小的數(shù).
                while(i < j && a[j] >= x) { 
                    j--;
                }
將這個比x小的數(shù)放在左邊的位置
                a[i++] = a[j];
                
                while (i < j && a[i] < x ) {
                    i++;
                };
                a[j--] = a[i];
                
            }
            a[i] = x;
            orderByQuick(a, l, i - 1);//排左邊
            orderByQuick(a, i+1, r);//排右邊.
        }
    }

堆排序

二叉樹
構(gòu)建最大堆读恃,調(diào)整最大堆,堆邏輯結(jié)構(gòu)表示為一個完全二叉樹代态,從最后一個非葉子節(jié)點開始構(gòu)建最大堆寺惫,將堆中的最大元素a[0] 和 最后一個元素互換位置,之后抹去已經(jīng)調(diào)整完成的最后一個元素蹦疑,剩余的元素繼續(xù)調(diào)整出最大堆西雀,以此循環(huán),直至所有元素調(diào)整完畢. 完全二叉樹每個節(jié)點下標滿足公式n = i/2 - 1, n代表節(jié)點歉摧,i代表節(jié)點下面的左孩子. 所以二叉樹最后一個節(jié)點下標是lastNode = (a.lenth - 1)/2 - 1艇肴。
最大堆:即任何節(jié)點都比自己左右孩子節(jié)點大.由此根節(jié)點顯然最大.

/**
     * 這個需要構(gòu)建最大堆.
     */
    public static void builMaxHeap(int a[],int begain,int end) {
        int curPointValue = a[begain];
        int leftIndex = 2*begain + 1;
        for(int i = leftIndex; i*2 + 1 < end ;) 
        {
           //意思是右孩子大于左孩子.
            if(i + 1 < end && a[i + 1] > a[i]) {
               如果右孩子i++,那么下一輪循環(huán),將對該節(jié)點下的孩子進行調(diào)整
如果沒有發(fā)生i++,則要調(diào)整的是左孩子下的所有節(jié)點.
                i++;
            }
            // 取出左右孩子中最大的孩子
            if(a[i] > curPointValue) { 
                int temp = a[i];
                a[i] = curPointValue;
                a[begain] = temp;
            }else //表示當(dāng)前節(jié)點自己就是最大的,不必重排了.
                break;
            
            begain = i;
            
        }
        
    }
    
    /**
     * 堆排序. 堆是具有某些特性的完全二叉樹.每個節(jié)點的值要么都大于等于或者小于等于其子節(jié)點.
     * @param a
     */
    public static void orderByHead(int a[]) {
        
        //構(gòu)建最大堆
        for(int i = (a.length - 1)/2 ; i >= 0 ; i--) 
        {
            builMaxHeap(a, i, a.length);
        }
        
        //調(diào)整最大堆.
        for(int j = a.length; j > 0 ; j--) {
            
            int temp = a[0];
            a[0] = a[j - 1];
            a[j-1] = temp;
            builMaxHeap(a,0, j);
        }
        
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叁温,一起剝皮案震驚了整個濱河市再悼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膝但,老刑警劉巖冲九,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锰镀,居然都是意外死亡,警方通過查閱死者的電腦和手機咖刃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門泳炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚎杨,你說我怎么就攤上這事花鹅。” “怎么了枫浙?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵刨肃,是天一觀的道長古拴。 經(jīng)常有香客問我,道長真友,這世上最難降的妖魔是什么黄痪? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮盔然,結(jié)果婚禮上桅打,老公的妹妹穿的比我還像新娘。我一直安慰自己愈案,他們只是感情好挺尾,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著站绪,像睡著了一般遭铺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恢准,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天魂挂,我揣著相機與錄音,去河邊找鬼顷歌。 笑死锰蓬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眯漩。 我是一名探鬼主播芹扭,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赦抖!你這毒婦竟也來了舱卡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤队萤,失蹤者是張志新(化名)和其女友劉穎轮锥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要尔,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡舍杜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赵辕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片既绩。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖还惠,靈堂內(nèi)的尸體忽然破棺而出饲握,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布救欧,位于F島的核電站衰粹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笆怠。R本人自食惡果不足惜铝耻,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑疆。 院中可真熱鬧田篇,春花似錦、人聲如沸箍铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈火。三九已至兽赁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冷守,已是汗流浹背刀崖。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍摇,地道東北人亮钦。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像充活,于是被迫代替她去往敵國和親蜂莉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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

  • 排序算法經(jīng)過了很長時間的演變混卵,產(chǎn)生了很多種不同的方法映穗。對于初學(xué)者來說,對它們進行整理便于理解記憶顯得很重要幕随。每種算...
    DNIX閱讀 1,698評論 0 2
  • 總結(jié)一下常見的排序算法蚁滋。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序赘淮。外排序:指在排序...
    jiangliang閱讀 1,334評論 0 1
  • 1 序 2016年6月25日夜辕录,帝都,天下著大雨梢卸,拖著行李箱和同學(xué)在校門口照了最后一張合照走诞,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,081評論 0 12
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序低剔,而外部排序是因排序的數(shù)據(jù)很大速梗,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 我將你,一直保存在我心中一直襟齿,不管你會離我有多遠我們總會在那個路口相遇 上篇回顧:蘇沐沐被蕭霖辰帶去見了客戶后姻锁,交...
    陌靜寧閱讀 161評論 0 0