1、算法描述:
冒泡排序法也叫气泡排序法,是交换排序的一种,是根据在水中轻气泡不能在重气泡之下的原则设计的。主要是想为:扫描所以数据,进行两两比较,发现违反轻气泡在重气泡之下的原则的数,交换其位置,让重气泡下沉,轻气泡上浮。
2、算法实现:
例如:要求对元素序列{23,49,32,56,12,87,65}进行冒泡排序,其过程分析如下:对于N个元素,最多进行N-1趟,每趟两两比较要N-1次
第一趟后序列为:23,32,49,12,56,65,87
第二趟后序列为:23,32,12,49,56,65,87
第三趟后序列为:23,12,32,49,56,65,87
第四趟后序列为:12,23,32,49,56,65,87
第五趟后序列为:12,23,32,49,56,65,87
第六趟后序列为:12,23,32,49,56,65,87
可以发现第一趟后最大的排在最后位置,第二趟后次大的排在倒数第二个位置,依次排好序时,进行了前五趟,故第六趟可以省略,但按通常的写法,我们要执行六趟,代码及结果如下:
int main()
{
int data[] = {23, 49, 32, 56, 12, 87, 65};
cout << "排序前的数组为:" << endl;
for (int i = 0; i < 7; i++){
cout << data[i] << " ";
}
cout << endl;
bubbleSort1(data, 7);
cout << "排序后的数组为:" << endl;
for (int i = 0; i < 7; i++){
cout << data[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
//一般算法实现
void bubbleSort1(int data[], int n)
{
int temp;
for (int i = 0; i < n-1; i++)
{
for (int j = 1; j < n; j++){
if (data[j - 1]>data[j]){
temp = data[j - 1];
data[j - 1] = data[j];
data[j] = temp;
}
}
cout << "第" << i+1 << "趟排序后的数组为:";
for (int k = 0; k < n; k++){
cout << data[k] << " ";
}
cout << endl;
}
}
运行结果如下:
算法改进:
根据算法描述可知,只要在某一趟比较中相邻两两元素只有比较动作而没有交换动作,说明排序完成,还是上面的例子,发现只要比较进行4趟就完成了排序,故可以设置一个标志位来判断是否发生了交换动作,改进后的程序如下:
void bubbleSort2(int data[], int n)
{
int flag;
int i = 1;
int tmp;
do
{
flag = 0;
for(int j = 1; j< n;j++)
{
if(data[j-1]>data[j])
{
temp = data[j-1];
data[j-1] = data[j];
data[j] = temp;
flag = 1;
}
}
i++;
} while(i<n&&flag = = 1);
}
运行结果如下:
3、算法时间度分析:
冒泡排序在最好的情况下,初始状态就已经是升序排列,则只需要进行N-1次元素之间的比较,且不用进行元素之间的移动即可结束排序,故最好情况下的时间复杂度为O(N);在最坏情况下即元素序列为逆序排列时,需要进行N-1趟排序,故最坏情况下时间复杂度为O(N2);在一般情况下,及随机分布的情况下,冒泡排序时间复杂度也为O(N2)。