今天来讲一讲老掉牙的冒泡排序,有关于它的优化问题。
主要是两种情况下的优化,一种是序列本身有序或者序列元素都相等,比如1 2 3 4 5 或者 1 1 1 1 1这样形式的数据;另一种是像3 2 1 4 5 6这样的数据,其特点是后半部分数据已经有序。优化的方法都是减少不必要的比较次数。
C语言实现代码如下:
bubbleSort(int * arr, int N){
int lastSawpIndex = 0;//记录一轮最后一次交换的位置
for(int i = 0; i < N - 1; ){
int swapTimes = 0;//记录一轮交换的次数
for(int j = 0; j < N - i -1; j++){
if(*(arr + j) > *(arr + j + 1)){
swapTimes++;
*(arr + j) = *(arr + j) ^ *(arr + j + 1);
*(arr + j + 1) = *(arr + j) ^ *(arr + j + 1);
*(arr + j) = *(arr + j) ^ *(arr + j + 1);
lastSawpIndex = j;//更新最后一次交换的位置
}
}
i = N - 1 - lastSawpIndex;//计算"实际"有序区间的大小,减少不必要的比较
if(!swapTimes){//交换的次数为0,说明有序,不需要再排序,跳出循环
break;
}
}
}