所谓冒泡排序,是一种简单的排序方法,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
实现原理及过程(含图解)
比如我们对 “8,9,1,3,5,2,7,6” 这组n个数据进行排序,首先我们先从第1个数开始,然后分别与其他几个数进行比较,如果遇到比其小的(大的)就交换,经过一轮循环后最大的数(或最小的数)就在最末端。
首先两个数进行比较,遇小交换,遇大保留大的,然后继续下去,第一轮交换后(如下图)
重复操作到n-1次,只是每次比较的数减少一个
每一次交换后结果:
代码:
(两重循环,外循环控制趟数,内循环控制每趟需要比较的个数)
#include <iostream>
using namespace std;
void BubbleSort(int a[],int n)
{
int t;
for(int i=0;i<n-1;i++) //循环n-1次即可,因为最后一次只有一个数
for(int j=0;j<n-i-1;j++) //参与比较的数每次减少一个
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
//下面为设置标记变量的做法,效率更高,如果事先已排好序或中途排好则会退出循环
//void BubbleSort(int a[],int n)
//{
// int t,flag,i=0;
// do
// {
// flag=0;
// for(int j=0;j<n-i-1;j++)
// {
// if(a[j]>a[j+1])
// {
// t=a[j];
// a[j]=a[j+1];
// a[j+1]=t;
// flag=1;
// }
// }
// i++;
// }while(flag&&i<n-1);
//
//}
int main()
{
int a[8]={8,9,1,3,5,2,7,6};
BubbleSort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<endl;
return 0;
}
时间复杂度: O(n²)
在设置标记变量之后:
如果事先已经排好序(正序),则一趟扫描即可完成,总的比较次数为n-1次,交换为0次,也就是说冒泡排序在最好情况下的时间复杂度为O(n);
如果事先顺序为逆序,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n²);
所以,当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n²)。
稳定性:
冒泡排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。