冒泡排序的时间复杂度为O(n^2),是一种原地排序,是一种稳定排序
冒泡排序的思想是:每趟冒泡将序列中未排序部分的相邻两元素比较交换,确保将其中的最大元素“沉底”,未排序部分的长度每趟减1,第K趟冒泡可将原序列的第K大元素“沉底”
冒泡排序算法思想简单,但效率很低。相比于直接插入排序,虽然时间复杂度均为O(n^2),但冒泡排序的“交换”次数要多很多,因此直接插入排序要优于冒泡排序
代码如下:
void swap(int * a, int * b){
assert(a != NULL);
assert(b != NULL);
if(a != b){
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
}
void process(int a[], int n){
assert(a != NULL);
assert(n > 0);
for(int i = n-1; i >= 1; i--){ //i确定当前未排序部分的范围[0, i]
for(int j = 0; j <= i-1; j++){ //j作为游标进行冒泡,注意j的上界是i-1,避免j+1时越界
if(a[j] > a[j+1])
swap(&a[j], &a[j+1]);
}
}
}