冒泡排序
简介:
冒泡排序属于交换排序的一种。
交换排序就是根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。交换排序的算法有很多,着重需要掌握的有冒泡排序和快速排序。
基本思想:
长为n的序列表,从前往后(或从后往前)两两比较相邻元素的值,若为逆序,则交换他们,知道所有序列比较完。每一趟冒泡都会将参与的元素的最小值(或者最大值放置序列的终端),下一次比较,序列就减少一个元素,直至最终排序完成。
代码示例:
void BubbleSort( int a[],int n){
for(int i=0;i<n-1;i++){
bool flag = false;//表示本趟冒泡排序是否发生交换的标志
for(int j=n-1;j>i;j--){//一趟冒泡排序
if(a[j-1]>a[j]{//若为逆序
swap(a[j-1],a[j]);
falg = true;
}
}
if(falg == false){
return ; //本趟遍历没有发生交换,说明表已有序
}
}
}
性能分析
空间效率:仅使用了常数个辅助单元,因而空间复杂度为 O(1);
时间效率:
最好的情况下(初始序列有序),第一趟冒泡 flag 为 false,直接跳出循环,比较次数为 n-1,移动次数为0,时间复杂度为 O(n);
最坏的情况下(初始序列为逆序),需要进行 n-1 趟排序,第 i 趟排序需要进行 n-i 次关键字的比较,每次都必须移动元素3次来交换位置。
比较次数(上)和移动次数(下)如下所示:
冒泡排序在最坏的情况下时间复杂度为 O(n²)。
所以冒泡排序的平均复杂度也为 O(n²)。
稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
希望大家能有所收获,一起学习。
若有错误,欢迎指出,谢谢。