排序——冒泡排序

来源:互联网 发布:名器大魔王推荐知乎 编辑:程序博客网 时间:2024/06/06 02:12

冒泡排序是一种交换排序

什么是交换排序呢?

交换排序:比较相邻两个元素的关键字 ,对不满足目标次序要求的那对数,两两交换,知道满足目标次序的要求。


基本思想

通过遍历数组元素 , 比较相邻两个元素关键字大小 ,调整这两个元素的位置使满足排序的要求 。遍历数组就是 重复地进行直到没有再需要交换,也就是说该数列已经排序完成。


下面进行冒泡排序 过程:     以  4 3 1 2 5 为例 (升序排列)


实现:

void BubbleSort(int arr[], size_t size){assert(arr);bool flag = false;for (int i = 0; i < size; i++){for (int j = 0; j < size - i - 1; j++){if (arr[j]  > arr[j + 1]){flag = true;std::swap(arr[j], arr[j + 1]);}}if (!flag)break;}}


时间复杂度

最好情况 :  若数组元素的顺序就是我们需要的顺序  , 那么一趟扫描就可以完成。所需关键字的比较次数C = N-1 ,移动次数M=0  此时,冒泡排序最好的时间复杂度O(n)

最坏情况: 若数组元素的顺序与我们需要的顺序恰好相反 ,需要N-1趟排序 。每一趟要进行N-i次比较(1 ≤ i ≤ N - 1) 和交换,此时交换次数和移动次数达到最大值:C = N(N-1)/2 =O(N^2) , 所以冒泡排序最坏的时间复杂度O(N^2)

因此,冒泡排序的平均时间复杂度为O(N2)。
总结起来,其实就是一句话:当数据越接近正序时,冒泡排序性能越好。


空间复杂度

没有借助辅助空间 , 所以空间复杂度O(1)

稳定性

由于冒泡排序是把数组所有相邻的元素都进行了比较 , 大的往后调整,小的往前调整 , 

相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法



冒泡排序的动画效果






0 0
原创粉丝点击