貌似是程序員基礎,我一個高級開發竟然只會冒泡(羞恥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