排序算法之 ____ 冒泡排序

寫于: 2016年06月06日

自學(xué)算法 ing ...

感謝iOS路上不可替代的小伙伴JXT (......)

加油, 努努! (ps:夜深人靜想點(diǎn)事情也方便.有點(diǎn)矯情了喔, 嘿_)

冒泡排序
原理

倆倆比較 相鄰記錄的排序碼, 若發(fā)生逆序, 則交換; 有兩種方式進(jìn)行冒泡, 一種是先把小元素的冒泡到前邊去(常用), 另一種是把大的元素冒泡到后邊.

實(shí)現(xiàn)步驟, 請(qǐng)前往下一篇:Take my word for it 看完這些 你會(huì)徹底理解排序算法看視頻喔!

性能

時(shí)間復(fù)雜度為O(N^2), 空間復(fù)雜度為O(1). (ps:不懂的自行百度喔)
排序是穩(wěn)定的, 排序比較次數(shù)與初始序列無關(guān), 但交換次數(shù)與初始序列有關(guān).

==廢話不說, 看代碼==

#include <stdio.h>
void swap(int *a, int *b);
int main () {
    int arr[10] = {15, 226, 34, 49, 6, 78, 523, 312, 8, 99};
    for (int i = 0; i < 10; i++) { //每一次由底至上地上升
        for (int j = 9; j> i; j--) {
            if (arr[j] < arr[j-1]) {
               swap(&arr[j], &arr[j-1]);
         }
      }
   }
   for (int i = 0; i < 10; i++) {
       printf("%d ",arr[i]);
   }
  return 0;
}
void swap(int *a, int *b) {
     int temp;  
     temp = *a;
     *a = *b;
     *b = temp;
}

結(jié)果:


優(yōu)化

比如{2,1,3,4,5,6,7,8,9},除了第一次循環(huán)交換,后面都會(huì)排好的無序在交換. 即初始序列就是排序好的, 對(duì)于冒泡排序任然還要比較O(N^2)次, 但無交換次數(shù). 可根據(jù)這個(gè)進(jìn)行優(yōu)化, 設(shè)置一個(gè)標(biāo)記變量flag, 標(biāo)記數(shù)列中的數(shù)是否在循環(huán)結(jié)束前就已經(jīng)排好序. 當(dāng)在一趟序列中沒有發(fā)生交換, 則該序列已排序好, 但優(yōu)化后排序的時(shí)間復(fù)雜度 沒有發(fā)生量級(jí)的改變.

==呈上代碼==

#include <stdio.h>
void swap(int *a, int *b);
int main() {
    int arr[10] = {2, 1, 3, 4, 5, 6, 7, 8 ,9, 10};
    int flag = 1; //設(shè)置標(biāo)記變量
    for (int i = 0; i < 10 && flag; i++) {
        flag = 0; //只要flag在下一次外循環(huán)條件檢測的時(shí)候值為0, 就說明已經(jīng)排好序,不用繼續(xù)循環(huán)
        for (int j = 9; j > i; j--) {
            if (arr[j] < arr[j-1]) {
               swap(&arr[j], &arr[j-1]);
               flag = 1; //如果有交換, 就將標(biāo)記變量賦1
        }
     }
  }
  for (int i = 0; i < 10; i++) {
      printf("%d ",arr[i]);
  }
 return 0;
}
void swap(int *a, int *b);
int temp;
temp = *a;
*a = *b;
*b = temp;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 七大排序算法之冒泡排序 @(算法筆記)[排序算法, 冒泡排序, C++實(shí)現(xiàn)] 冒泡排序介紹 冒泡排序是七大排序算法...
    harry502閱讀 670評(píng)論 2 10
  • 互聯(lián)網(wǎng)行業(yè)從業(yè)者在面試的過程中經(jīng)常會(huì)碰到這樣一個(gè)問題,尤以測試人員和開發(fā)人員碰到的幾率最高:請(qǐng)說一說你熟悉的幾種排...
    檸檬班軟件測試閱讀 740評(píng)論 0 2
  • 定義:重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直...
    林小楠愛搗鼓閱讀 164評(píng)論 0 1
  • 冒泡排序是一種極其簡單的排序算法,也是我所學(xué)的第一個(gè)排序算法。它重復(fù)地走訪過要排序的元素,一次比較相鄰兩個(gè)元素,如...
    BEYOND黃閱讀 354評(píng)論 0 1
  • 專項(xiàng):Android內(nèi)存泄露實(shí)踐分析 定義 ? 內(nèi)存泄漏也稱作“存儲(chǔ)滲漏”,用動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)開...
    Heiniu閱讀 855評(píng)論 1 13

友情鏈接更多精彩內(nèi)容