排序算法

1.冒泡排序
2.選擇排序
3.插入排序
4.快速排序
5.堆排序
6.希爾排序
7.歸并排序
8.計數(shù)排序
9.桶排序
10.基數(shù)排序

該篇排序方式:由小到大排序
1.冒泡排序
從后向前冒泡
從前向后冒泡

由小到大,從后向前冒泡:[90饱岸,78吹榴,65祟敛,43望薄,20]
一次冒泡
第一次比較:[90槽驶,78握侧,65蚯瞧,20,43] 一次交換操作
第二次比較:[90品擎,78埋合,20,65萄传,43] 一次交換操作
第三次比較:[90甚颂,20,78秀菱,65振诬,43] 一次交換操作
第四次比較:[20,90衍菱,78赶么,65,43] 一次交換操作
二次冒泡
第一次比較:[20脊串,90辫呻,78,43琼锋,65] 一次交換操作
第二次比較:[20印屁,90,43斩例,78雄人,65] 一次交換操作
第三次比較:[20,43,90础钠,78恰力,65] 一次交換操作
三次冒泡
第一次比較:[20,43旗吁,90踩萎,65,78] 一次交換操作
第二次比較:[20很钓,43香府,65,90码倦,78] 一次交換操作
四次冒泡
第一次比較:[20企孩,43,65袁稽,78勿璃,90] 一次交換操作
共十次交換操作
1.最后一個元素與相鄰元素對比
2.小于相鄰元素,則交換
3.大于等于相鄰元素推汽,無需交換补疑,繼續(xù)相鄰元素的對比
4.直到與最左邊的元素對比完成,一次冒泡結束
5.對剩下的序列歹撒,重復1~4的步驟
6.直到剩下的序列長度為1莲组,整個冒泡結束

1.不使用遞歸實現(xiàn)

/**
 * 冒泡排序
 * 
 * 由小到大排序
 * 
 * 從后向前冒泡
 * 
 * @param arr
 */
public void bubbleSort(int[] arr) {
    if (arr == null || arr.length == 0)
        return;
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = arr.length - 1; j > i; j--) {
            if (arr[j] < arr[j - 1]) {
                swap(arr, j - 1, j);
            }
        }
    }
}

public void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

2.使用遞歸方式實現(xiàn)

/**
*
*冒泡排序函數(shù)
*/
public void sortByBubble(int[] paramInts) {
   sortByBubble(paramInts, 0);
}

/**
*
*冒泡排序的輔助方法
*paramInts:排序的數(shù)組對象
*index:序列最左邊下標
*/
private void sortByBubble(int[] paramInts, int index) {
    if (index == paramInts.length - 1) {
        return;
    }
    for (int i = paramInts.length - 1; i > index; i--) {
        if (paramInts[i] < paramInts[i - 1]) {
            int tempValue = paramInts[i];
            paramInts[i] = paramInts[i - 1];
            paramInts[i - 1] = tempValue;
        }
    }
    sortByBubble(paramInts, index + 1);
}

從前向后冒泡
1.第一個元素與相鄰的元素對比
2.小于相鄰元素,則交換
3.大于等于相鄰元素暖夭,無需交換胁编,繼續(xù)相鄰元素的對比
4.直到與最右邊元素對比完成,一次冒泡結束
5.對剩下的序列鳞尔,重復1~4的步驟
6.直到剩下的序列長度為1,完成整個數(shù)組的冒泡

1.一次冒泡過程不使用遞歸實現(xiàn)

public void sortByBubble(int[] paramInts) {
    sortByBubble(paramInts, paramInts.length - 1);
}
/**
*
*由前向后冒泡排序的輔助方法
*paramInts:排序數(shù)組對象
*index:序列最右邊的下標
*/
private void sortByBubble(int[] paramInts, int index) {
    if (index == 0) {//沒有可冒泡的序列了
        return;
    }
    for (int i = 0; i < index; i++) {
        if (paramInts[i + 1] > paramInts[i]) {//小于相鄰元素
            //與相鄰元素交換
            int tempValue = paramInts[i];
            paramInts[i] = paramInts[i + 1];
            paramInts[i + 1] = tempValue;
        } 
    }
    sortByBubble(paramInts, index - 1);
}

2.一次冒泡過程使用遞歸代替for語句實現(xiàn)

/**
*
*冒泡排序
*
*使用遞歸方法實現(xiàn)
*/
private void sortByBubblinf(int[] paramInts) {
    sortByBubbling(paramInts, 0, paramInts.length - 1);
}
/**
*
*冒泡排序遞歸實現(xiàn)的輔助方法
*paramInts:排序的數(shù)組對象
*index:對比到元素的下標
*minInex:序列最右邊元素下標
*/
private void sortByBubbling(int[] paramInts, int index, int minIndex)  {
    if (minIndex == 0) {//左邊沒有可對比的相鄰元素
        return;
    } else if (index == minIndex) {//沒有可對比的元素
        //重復1~5步驟
        sortByBubbling(paramInts, 0, minIndex - 1);
    } else if (paramInts[index] < paramInts[index + 1]) {
        //小于相鄰元素早直,與相鄰元素交換
        int temp = paramInts[index];
        paramInts[index] = paramInts[index + 1];
        paramInts[index + 1] = temp;
        sortByBubbling(paramInts, index + 1, minIndex); 
    } else {
        //大于等于相鄰元素寥假,重復步驟1~3
        sortByBubbling(paramInts, index + 1, minIndex);
    }  
}

介紹完冒泡排序,講解一下冒泡的時間復雜度
冒泡排序的時間復雜度為O(n^2)

時間復雜度
計算方法
1.一般情況下霞扬,算法中基本操作重復執(zhí)行的次數(shù)是問題規(guī)模n的某個函數(shù)糕韧,用T(n)表示,若有某個輔助函數(shù)f(n),使得當n趨近于無窮大時喻圃,T(n)/f(n)的極限值為不等于零的常數(shù)萤彩,則稱f(n)是T(n)的同數(shù)量級函數(shù)。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度斧拍,簡稱時間復雜度雀扶。
分析:隨著模塊n的增大,算法執(zhí)行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小愚墓,算法的時間復雜度越低予权,算法的效率越高。

冒泡排序的時間復雜度計算過程:
冒泡排序是一種用時間換空間的排序方法浪册,最壞情況是把順序的排列變成逆序扫腺,或者把逆序的數(shù)列變成順序。
在這種情況下村象,每一次比較都需要進行交換運算笆环。
舉個例子來說,一個數(shù)列 5 4 3 2 1 進行冒泡升序排列厚者,
第一次大循環(huán)從第一個數(shù)(5)開始到倒數(shù)第二個數(shù)(2)結束躁劣,
比較過程:先比較5和4,4比5小籍救,交換位置變成4 5 3 2 1习绢;
比較5和3,3比5小蝙昙,交換位置變成4 3 5 2 1
……
最后比較5和1闪萄,1比5小,交換位置變成4 3 2 1 5奇颠。
這時候共進行了4次比較交換運算败去,最后1個數(shù)變成了數(shù)列最大數(shù)。
第二次大循環(huán)從第一個數(shù)(4)開始到倒數(shù)第三個數(shù)(2)結束烈拒。進行3次比較交換運算圆裕。
……
所以總的比較次數(shù)為 4 + 3 + 2 + 1 = 10次對于n位的數(shù)列則有比較次數(shù)為 (n-1) + (n-2) + ... + 1 = n * (n - 1) / 2,這就得到了最大的比較次數(shù)而O(N^2)表示的是復雜度的數(shù)量級荆几。
舉個例子來說吓妆,如果n = 10000,那么 n(n-1)/2 = (n^2 - n) / 2 = (100000000 - 10000) / 2吨铸,相對10^8來說行拢,10000小的可以忽略不計了,所以總計算次數(shù)約為0.5 * N2诞吱。用O(N2)就表示了其數(shù)量級(忽略前面系數(shù)0.5)舟奠。

2.選擇排序
[90,78房维,65沼瘫,43,20]
一次選擇[20, 78, 65, 43, 90] 一次交換操作
二次選擇:[20, 43, 65, 78, 90] 一次交換操作
三次選擇:[20, 43, 65, 78, 90] 0次交換操作
四次選擇:[20, 43, 65, 78, 90] 0次交換操作
共兩次交換操作
1.查找序列中的最小元素與序列最左邊元素交換
2.剩下的序列中咙俩,重復1步驟
3.直到序列的長度為1耿戚,完成排序

/**
*選擇排序
*/
public void sortByCulling(int[] paramInts) {
    sortByCulling(paramInts, 0);
}
/**
*選擇排序輔助方法
*paramInts:排序的數(shù)組對象
*index:序列最左邊元素的下標
*
*/
private void sortByCulling(int[] paramInts, int index) {
    if (index == paramInts.length - 1) {
        return;
    } 
    //查詢序列中的最小元素
    int tempIndex = index;
    int tempValue = paramInts[tempIndex];
    //掃描序列中的元素
    for (int i = index + 1; i < paramInts.length; i++) {
        if ( paramInts[i] < tempValue) {//找到更小的元素
            //記錄下最小元素及下標
            tempValue = paramInts[i];
            tempIndex = i;
        }
    }
    //掃描完序列
    //判斷最小元素是否是序列最左邊的元素
    if (tempIndex != index) {//不是
        //交換元素
        paramInts[tempIndex] = paramInts[index];
        paramInts[index] = tempValue;
    }  
    //調(diào)用函數(shù)本身
    sortByCulling(paramInts, index + 1);
}

3.插入排序
[90,78,65溅话,43晓锻,20]
一次插入
[78, 90, 65, 43, 20] 一次交換操作
二次插入
[78, 65, 90, 43, 20] 一次交換操作
[65, 78, 90, 43, 20] 一次交換操作
三次插入
[65, 78, 43, 90, 20] 一次交換操作
[65, 43, 78, 90, 20] 一次交換操作
[43, 65, 78, 90, 20] 一次交換操作
四次插入:
[43, 65, 78, 20, 90] 一次交換操作
[43, 65, 20, 78, 90] 一次交換操作
[43, 20, 65, 78, 90] 一次交換操作
[20, 43, 65, 78, 90] 一次交換操作
共十次交換操作
1.從第一個元素開始,該元素認定為已經(jīng)被排序
2.取出下一個元素與已經(jīng)排序的元素從后向前依次對比
3.如果取出的元素小與對比的元素飞几,則交換
4.直到大于等于對比的元素則停止
5.重復2~4的步驟
6.直到?jīng)]有可取出的元素為止

/**
*插入排序函數(shù)
*
*/
public void sortByInsertionCulling (int[] paramInts) {
    sortByInsertionCulling(paramInts, 1);
}
/**
*插入排序輔助方法
*paramInts:排序數(shù)組對象
*index:取出元素的下標
*/
private void sortByInsertionCulling(int[] paramInts, int index) {
    if (index == paramInts.length) {//取出元素的下標已經(jīng)超出數(shù)組的長度砚哆,已經(jīng)沒有可取的元素
        return;
    }
    //取出下標為index的元素
    int tempValue = paramInts[index];
    //記錄取出元素的下標
    int tempIndex = index;
    //取出的元素與已經(jīng)排序的元素從后向前依次對比
    for (int i = index - 1; i >= 0; i--) {
        if (tempValue < paramInts[i]) {//取出的元素小于當前元素
            //與當前元素交換
            paramInts[tempIndex] = paramInts[i];
            paramInts[i] = tempValue;
            tempIndex = i;
        } else {//小于等于取出的元素
            //停止對比
            break;
        }
    }
    //重復2~4步驟,調(diào)用函數(shù)本身
    sortByInsertionCulling(paramInts, index + 1);
}

快速排序
基本思想是:通過一趟排序將要排序的數(shù)據(jù)分割成獨立的兩部分屑墨,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小躁锁,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行卵史,以此達到整個數(shù)據(jù)變成有序序列
[90战转,78,65以躯,43槐秧,20]
一趟快速排序
[20, 78, 65, 43, 90] 一次交換操作
兩趟快速排序
[20, 78, 65, 43, 90] 0次交換操作
三趟快速排序
[20, 43, 65, 78, 90] 一次交換操作
四趟快速排序
[20, 43, 65, 78, 90] 0次交換操作
共兩次交換操作
參考文章一
參考文章二

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忧设,隨后出現(xiàn)的幾起案子刁标,更是在濱河造成了極大的恐慌,老刑警劉巖址晕,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀懈,死亡現(xiàn)場離奇詭異,居然都是意外死亡谨垃,警方通過查閱死者的電腦和手機启搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刘陶,“玉大人胳赌,你說我怎么就攤上這事〕赘簦” “怎么了疑苫?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牡直。 經(jīng)常有香客問我,道長纳决,這世上最難降的妖魔是什么碰逸? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阔加,結果婚禮上饵史,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好胳喷,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布湃番。 她就那樣靜靜地躺著,像睡著了一般吭露。 火紅的嫁衣襯著肌膚如雪吠撮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天讲竿,我揣著相機與錄音泥兰,去河邊找鬼。 笑死题禀,一個胖子當著我的面吹牛鞋诗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迈嘹,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼削彬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秀仲?” 一聲冷哼從身側響起融痛,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啄育,沒想到半個月后酌心,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡挑豌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年安券,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氓英。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侯勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铝阐,到底是詐尸還是另有隱情址貌,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布徘键,位于F島的核電站练对,受9級特大地震影響,放射性物質發(fā)生泄漏吹害。R本人自食惡果不足惜螟凭,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望它呀。 院中可真熱鬧螺男,春花似錦棒厘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淆院,卻和暖如春何乎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迫筑。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工宪赶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脯燃。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓搂妻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辕棚。 傳聞我的和親對象是個殘疾皇子欲主,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序逝嚎,而外部排序是因排序的數(shù)據(jù)很大扁瓢,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序补君,而外部排序是因排序的數(shù)據(jù)很大引几,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序挽铁,而外部排序是因排序的數(shù)據(jù)很大伟桅,一次不能容納全部的...
    Luc_閱讀 2,270評論 0 35
  • 一、概述 排序算法概念 在計算機科學與數(shù)學中叽掘,一個排序算法是將一組雜亂無章的數(shù)據(jù)按一定的規(guī)律順次排列起來的算法楣铁。排...
    簡書冷雨閱讀 1,031評論 0 0
  • 今天,忽而想起了小蕊子更扁,一頭烏黑的短發(fā)盖腕,烏溜溜的大眼睛,高挺的鼻梁浓镜,一張大厚嘴唇向外翻著溃列。 不記得她...
    yeyingzi閱讀 239評論 0 0