冒泡排序

一、算法描述:

1.比較相鄰的元素肴茄,如果前一個(gè)比后一個(gè)大,交換
2.第一次排序第1個(gè)和第2個(gè)一對(duì)但指,比較與交換寡痰,然后第二個(gè)和第三個(gè)對(duì)比交換,以此類推棋凳,直到比較倒數(shù)第二個(gè)和最后一個(gè)為止
3.重復(fù)步驟2拦坠,直到?jīng)]有任何數(shù)字需要進(jìn)行比較

二、算法分析

時(shí)間復(fù)雜度

1.正序(一趟掃描即可完成排序)

所需的關(guān)鍵字比較次數(shù) C 和記錄移動(dòng)次數(shù) N 都是最小值:(n:數(shù)據(jù)規(guī)模)
Cmin=n-1
Mmin=0

2.逆序(進(jìn)行n-1次排序)

每次排序都要進(jìn)行 n-i 次比較(1<=i<=n-1)剩岳,且每次比較都需要移動(dòng)贞滨,這種情況,比較和移動(dòng)次數(shù)都達(dá)到了最大
Cman= n(n-1)/2=O(n2)
Mman=3n(n-1)/2=O(n2)
冒泡排序的平均時(shí)間復(fù)雜度為O(n2)

算法穩(wěn)定性

冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)拍棕。比較是相鄰的兩個(gè)元素比較疲迂,交換也發(fā)生在這兩個(gè)元素之間。所以莫湘,如果兩個(gè)元素相等,是不會(huì)再交換的郑气;如果兩個(gè)相等的元素沒有相鄰幅垮,那么即使通過前面的兩兩交換把兩個(gè)相鄰起來,這時(shí)候也不會(huì)交換尾组,所以相同元素的前后順序并沒有改變忙芒,所以冒泡排序是一種穩(wěn)定排序算法

三示弓、具體代碼

1.Java

public class BubbleSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 對(duì) arr 進(jìn)行拷貝,不改變參數(shù)內(nèi)容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        for (int i = 1; i < arr.length; i++) {
            // 設(shè)定一個(gè)標(biāo)記呵萨,若為true奏属,則表示此次循環(huán)沒有進(jìn)行交換,也就是待排序列已經(jīng)有序潮峦,排序已經(jīng)完成囱皿。每次遍歷標(biāo)志位都要先置為true,才能判斷后面的元素是否發(fā)生了交換
            boolean flag = true;
            for (int j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    flag = false;
                }
            }
//// 判斷標(biāo)志位是否為false忱嘹,如果為false嘱腥,說明后面的元素已經(jīng)有序,就直接return
            if (flag) {
                break;
            }
        }
        return arr;
    }
}

2.C語言

/* 冒泡排序 */
/* 1. 從當(dāng)前元素起拘悦,向后依次比較每一對(duì)相鄰元素齿兔,若逆序則交換 */
/* 2. 對(duì)所有元素均重復(fù)以上步驟,直至最后一個(gè)元素 */
/* elemType arr[]: 排序目標(biāo)數(shù)組; int len: 元素個(gè)數(shù) */
void bubbleSort (elemType arr[], int len) {
    elemType temp;
    int i, j;
    for (i=0; i<len-1; i++) /* 外循環(huán)為排序趟數(shù)础米,len個(gè)數(shù)進(jìn)行l(wèi)en-1趟 */
        for (j=0; j<len-1-i; j++) { /* 內(nèi)循環(huán)為每趟比較的次數(shù)分苇,第i趟比較len-i次 */
            if (arr[j] > arr[j+1]) { /* 相鄰元素比較,若逆序則交換(升序?yàn)樽蟠笥谟移ㄉ#敌蚍粗?*/
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
}
 
int main (void) {
    elemType arr[ARR_LEN] = {3,5,1,-7,4,9,-6,8,10,4};
    int len = 10;
    int i;
    bubbleSort (arr, len);
    for (i=0; i<len; i++)
    printf ("%d\t", arr[i]);
    putchar ('\n');
    return 0;
}

3.C++

#include <iostream>
using namespace std;
template<typename T>
//整數(shù)或浮點(diǎn)數(shù)皆可使用
void bubble_sort(T arr[], int len){
    int i, j;  T temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
        if (arr[j] > arr[j + 1]){
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
}
int main(){
    int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    for (int i = 0; i < len; i++)
        cout << arr[i] << ' ';
    cout << endl;
    float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
    len = (int) sizeof(arrf) / sizeof(*arrf);
    bubble_sort(arrf, len);
    for (int i = 0; i < len; i++)
        cout << arrf[i] << ' ';
    return 0;
}

4.Kotlin

fun bubbleSort(array: Array<Int>) { 
   val arrayLength = array.size    
   for (i in 0 until arrayLength) {        
       for (j in 0 until arrayLength - i - 1) {            
           if (array[j] > array[j + 1]) {                
               val temp = array[j]                
               array[j] = array[j + 1]                
               array[j + 1] = temp           
           }       
       }   
   }   
   // Prints result.
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允睹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滔灶,更是在濱河造成了極大的恐慌瘦癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乌叶,死亡現(xiàn)場(chǎng)離奇詭異盆偿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)准浴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門事扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乐横,你說我怎么就攤上這事求橄。” “怎么了葡公?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵罐农,是天一觀的道長。 經(jīng)常有香客問我催什,道長涵亏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮气筋,結(jié)果婚禮上拆内,老公的妹妹穿的比我還像新娘。我一直安慰自己宠默,他們只是感情好麸恍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搀矫,像睡著了一般抹沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾君,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天采够,我揣著相機(jī)與錄音,去河邊找鬼冰垄。 笑死蹬癌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虹茶。 我是一名探鬼主播逝薪,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蝴罪!你這毒婦竟也來了董济?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤要门,失蹤者是張志新(化名)和其女友劉穎虏肾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢搜,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡封豪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炒瘟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吹埠。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疮装,靈堂內(nèi)的尸體忽然破棺而出缘琅,到底是詐尸還是另有隱情,我是刑警寧澤廓推,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布刷袍,位于F島的核電站,受9級(jí)特大地震影響樊展,放射性物質(zhì)發(fā)生泄漏呻纹。R本人自食惡果不足惜鸽心,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望居暖。 院中可真熱鬧,春花似錦藤肢、人聲如沸太闺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽省骂。三九已至,卻和暖如春最住,著一層夾襖步出監(jiān)牢的瞬間钞澳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工涨缚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧粟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓脓魏,卻偏偏與公主長得像兰吟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茂翔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354