算法-冒泡排序

原文鏈接,我的新博客


貌似是程序員基礎,我一個高級開發竟然只會冒泡(羞恥ing…)

前言

之前買了劍指offer,一直擱那裏沒怎麼看,現在挑燈夜讀擠出點時間學習下,在這之前還是得先把基礎給打牢,這裏先介紹算法入門-冒泡排序

核心思想

冒泡排序的核心思想就是通過與相鄰元素的比較和交換,把小的數交換到最前面。因爲這個過程類似於水泡向上升一樣,因此被命名爲冒泡排序。

示例

  • 第一輪過程: i=0~9;依次進行arr[i]與arr[i+1]對比;arr[i]小則不交換,arr[i+1]小則與arr[i]交換位置,由於100在這裏面是最大的,100遇到任何數都要交換,最後換到末尾位置;
    冒泡過程
  • 第二輪與第一輪一樣從i=0開始,依次進行arr[i]與arr[i+1]對比,數組長度爲n,則執行n-1輪後結束排序。
  • 整個排序過程:
原始長度數組 長度10
100 5   3   11  33  6   8   7   1   3   
第1輪
5   3   11  33  6   8   7   1   3   100 
第2輪
3   5   11  6   8   7   1   3   33  100 
第3輪
3   5   6   8   7   1   3   11  33  100 
第4輪
3   5   6   7   1   3   8   11  33  100 
第5輪
3   5   6   1   3   7   8   11  33  100 
第6輪
3   5   1   3   6   7   8   11  33  100 
第7輪
3   1   3   5   6   7   8   11  33  100 
第8輪
1   3   3   5   6   7   8   11  33  100 
第9輪
1   3   3   5   6   7   8   11  33  100 

時間複雜度

從算法思想可知,冒泡排序需要兩個循環來控制遍歷,也就是需要n * n趟才能判斷、交換完成。冒泡排序的時間複雜度爲O ( n^2)。

C語言代碼

void paopaoSort(int arr[] ,int len) {
    printf("原始長度%d\n",len);
    printfArr(arr, len);
    for (int i = 0; i < len-1; i++) {
        printf("第%d輪\n",i+1);
        for (int j = 0; j < len-1; j++) {
            int preNum = arr[j];
            int nexNum = arr[j+1];
            if (preNum<=nexNum) {
            }else{
                int temp = preNum;
                arr[j] = nexNum;
                arr[j+1] = temp;
            }
        }
    }
}

總結

在對比每一輪結構後可以發現,後面部分數組已經有序,可以無需對比,可以將i

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章