冒泡排序簡介
冒泡排序的基本操作就是將重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,時間複雜度爲O(n^2)。
冒泡排序的模擬過程可以看鏈接:BubbleSortion
實現過程
爲了比較容易地理解冒泡排序,我們可以列出一組數據,比如:
5,6,4
我列出了兩種方法分別說明插入排序的實現過程,你可以選擇自己喜歡的方法:
第一種
對於冒泡排序算法來說:
1. 第一輪:
比較5, 6
–> 比較6, 4
交換–> 比較4, 6
得到數據:5, 4, 6
2. 第二輪:
比較5, 4
交換–> 比較4, 5
得到數據4, 5, 6
第二種
分析以上過程,我們發現冒泡排序有兩個關鍵要素:
1. 爲了能夠進行重複的來回循環,我們需要用到迭代
2. 通過每次遍歷最大的數都放在了隊列的末尾
代碼實現
#include <stdio.h>
void print(const int *a, const int length) {
int i;
for (i = 0; i<length; i++) {
printf("%d ", a[i]);
}
putchar('\n');
}
void exchange(int *a, const int i, const int j) {
int tmp = *(a + i);
*(a + i) = *(a + j);
*(a + j) = tmp;
}
void bubbleSort(int *a, const int length) {
for (int i = 0; i < length; i++) {
//迭代
for (int j = 0; j + 1 < length-i; j++) {
if (a[j] > a[j + 1]) { //前後的兩個數比較
exchange(a, j, j + 1);
}
}
print(a, length);
}
}
void main() {
const int length = 5;
int my_array[5] = { 6,5,7,3,4};
print(my_array, length);
bubbleSort(my_array, length);
print(my_array, length);
}
代碼精簡
void bubbleSort(int *a, const int length){
for(int i=0; i<length-1; i++){
for(int j=0; j<length-1-i; j++){
if(j+1<length && a[j]>a[j+1]){
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}