交換排序:冒泡排序(Bubble Sort)

基本思想:

將n個(gè)記錄看作按縱向排列叭莫,在要排序的一組數(shù)中蹈集,對(duì)當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整雇初,讓較大的數(shù)往下沉拢肆,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換郭怪,整個(gè)排序過程共進(jìn)行n-1趟支示。如下所示:

初態(tài) 第1趟 第2趟 第3趟 第4趟 第5趟 第6趟 第7趟
 49   38   38   38    38   13   13   13
 38   49   49   49    13   27   27   27 
 65   65   65   13    27   38   38
 97   76   13   27    49   49
 76   13   27   49    49
 13   27   49   65
 27   49   76 
 49   97    

算法的實(shí)現(xiàn):

// 輸出數(shù)組內(nèi)容
void print(int array[], int length, int i) {
    printf("i=%d:",i);
    for (int j = 0; j < length; j++) {
        printf(" %d ", array[j]);
    }
    printf("\n");
}

// 冒泡排序(Bubble Sort)
void bubbleSort(int array[], int length) {
    if(NULL == array || 0 == length) {
        return;
    }
    
    for (int i = 0; i < length - 1; i++) {
        for (int j = 0; j < length - i - 1; j++) {
            if (array[j] > array[j+1]) {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
        print(array, length, i); // 打印每趟排序的結(jié)果
    }
    
    return;
}

int main(int argc, const char * argv[]) {
    int arrayBubbleSort[8] = { 49, 38, 65, 97, 76, 13, 27, 49 };
    bubbleSort(arrayBubbleSort, 8);
    printf("\n");
    
    return 0;
}

冒泡排序算法的改進(jìn)

對(duì)冒泡排序常見的改進(jìn)方法是加入一標(biāo)志性變量exchange,用于標(biāo)志某一趟排序過程中是否有數(shù)據(jù)交換鄙才,如果進(jìn)行某一趟排序時(shí)并沒有進(jìn)行數(shù)據(jù)交換颂鸿,則說明數(shù)據(jù)已經(jīng)按要求排列好,可立即結(jié)束排序攒庵,避免不必要的比較過程嘴纺。本文再提供以下兩種改進(jìn)算法:

1、設(shè)置一標(biāo)志性變量pos,用于記錄每趟排序中最后一次進(jìn)行交換的位置浓冒。由于pos位置之后的記錄均已交換到位,故在進(jìn)行下一趟排序時(shí)只要掃描到pos位置即可栽渴。

改進(jìn)后算法如下:

// 冒泡排序改進(jìn)1(Bubble Sort)
void bubbleSort1(int array[], int length) {
    int i = length - 1; // 初始時(shí),最后位置保持不變
    while (i > 0) {
        int pos = 0; // 每趟開始時(shí)稳懒,無記錄交換
        for (int j = 0; j < i; j ++) {
            if (array[j] > array[j+1]) {
                pos = j; // 記錄交換的位置
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
        print(array, length, i); // 打印每趟排序的結(jié)果
        i = pos; // 為下一趟排序作準(zhǔn)備
    }
}

2闲擦、傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個(gè)最大值或最小值,我們考慮利用在每趟排序中進(jìn)行正向和反向兩遍冒泡的方法一次可以得到兩個(gè)最終值(最大者和最小者) , 從而使排序趟數(shù)幾乎減少了一半。

改進(jìn)后算法如下:

// 冒泡排序改進(jìn)2(Bubble Sort)
void bubbleSort2(int array[], int length) {
    int low = 0;
    int high = length - 1; // 設(shè)置變量的初始值
    int temp,j;
    while (low < high) {
        for (j = low; j < high; j ++) { // 正向冒泡僚祷,找到最大值
            if (array[j] > array[j+1]) {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
        --high; // 修改high值佛致,前移一位
    
        for (j = high; j > low; j --) { // 反射冒泡,找到最小值
            if (array[j] < array[j-1]) {
                temp = array[j];
                array[j] = array[j-1];
                array[j-1] = temp;
            }
        }
        ++low; // 修改low值辙谜,后移一位
    }
}

總結(jié)

冒泡排序畢竟是一種效率低下的排序方法俺榆,在數(shù)據(jù)規(guī)模很小時(shí),可以采用装哆。數(shù)據(jù)規(guī)模比較大時(shí)罐脊,最好用其它排序方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜕琴,一起剝皮案震驚了整個(gè)濱河市萍桌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凌简,老刑警劉巖上炎,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雏搂,居然都是意外死亡藕施,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門凸郑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裳食,“玉大人,你說我怎么就攤上這事芙沥』寤觯” “怎么了浊吏?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)救氯。 經(jīng)常有香客問我找田,道長(zhǎng),這世上最難降的妖魔是什么径密? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任午阵,我火速辦了婚禮,結(jié)果婚禮上享扔,老公的妹妹穿的比我還像新娘底桂。我一直安慰自己,他們只是感情好惧眠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布籽懦。 她就那樣靜靜地躺著,像睡著了一般氛魁。 火紅的嫁衣襯著肌膚如雪暮顺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天秀存,我揣著相機(jī)與錄音捶码,去河邊找鬼。 笑死或链,一個(gè)胖子當(dāng)著我的面吹牛惫恼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澳盐,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼祈纯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了叼耙?” 一聲冷哼從身側(cè)響起腕窥,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筛婉,沒想到半個(gè)月后簇爆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爽撒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年冕碟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匆浙。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厕妖,靈堂內(nèi)的尸體忽然破棺而出首尼,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布软能,位于F島的核電站迎捺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏查排。R本人自食惡果不足惜凳枝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跋核。 院中可真熱鬧岖瑰,春花似錦、人聲如沸砂代。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻伊。三九已至露戒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捶箱,已是汗流浹背智什。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丁屎,地道東北人荠锭。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悦屏,于是被迫代替她去往敵國(guó)和親节沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 概述 排序有內(nèi)部排序和外部排序础爬,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序甫贯,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,168評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序看蚜,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序叫搁,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評(píng)論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,243評(píng)論 0 2
  • 概述排序有內(nèi)部排序和外部排序供炎,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序渴逻,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,259評(píng)論 0 35
  • 某次二面時(shí)音诫,面試官問起Js排序問題惨奕,吾絞盡腦汁回答了幾種,深感算法有很大的問題竭钝,所以總計(jì)一下梨撞! 排序算法說明 (1...
    流浪的先知閱讀 1,189評(píng)論 0 4