冒泡排序(Bubble Sort)是一种比较基础的排序算法,它的原理是从头到尾比较2个相邻的数,如果前面比后面小,就交换2个数的位置,否则不变,这样一趟下来,最大的数就到了最后(从大到小排序就最小的到最后),最后一个数已经确定,暂且不动,对前面的数在重复这个过程,每趟都会固定一个数,n趟后,这n个数的数组就排好序的了。
冒泡过程的示意图:
代码示例:
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;
}
}
}
}