冒泡排序(Bubble Sort)是一種比較基礎的排序算法,它的原理是從頭到尾比較2個相鄰的數,如果前面比后面小,就交換2個數的位置,否則不變,這樣一趟下來,最大的數就到了最后(從大到小排序就最小的到最后),最后一個數已經確定,暫且不動,對前面的數在重復這個過程,每趟都會固定一個數,n趟后,這n個數的數組就排好序的了。
冒泡過程的示意圖:
bubble.png
代碼示例:
void swap(int &a, int &b) {
a += b;
b = a - b;
a = a - b;
}
void bubble(int a[], int n) {
for(int i = 0; i < n; i++) {
for(int j = 1; j < n-i; j++) {
if(a[j-1] > a[j]) {
swap(a[j-1], a[j]);
}
}
}
}
這里其實還有1個可以優化的點,就是如果某一趟排序最后交換的位置在j-1和j,那么下一趟,對位置j和j之后的比較是沒有意義的,因為后面已經都是有序的,并且肯定都比前面的大(如果從大到小排序就相反),所以每一趟排序完成后記錄下最后交換的位置可以在大多數情況下減少比較的次數,但是這個優化并不會改變冒泡排序的時間復雜度,因為在最壞情況下(比如:要求從小到大排序,初始數組剛好是從大到小有序),每次都要交換到當前的最后一個位置,并不會減少任何比較的次數。
優化后代碼示例:
void swap(int &a, int &b) {
a += b;
b = a - b;
a = a - b;
}
void bubbleSuper(int a[], int n) {
int index = n;
while(index > 1) {
int k = index;
index = 1;
for(int j = 1; j < k; j++) {
if(a[j-1] > a[j]) {
swap(a[j-1], a[j]);
index = j;
}
}
}
}