冒泡排序是一种最简单的排序算法。
基本思想:对于一组数据,从第一个开始,与其右边相邻数据作比较。若a[i]>a[i+1],则两个数据互换位置,该方法是把数据由小到大排列;如果要把数据从大到小排列,则a[i]<a[i+1]时,交换数据位置。若有n个数据,一共需要经过n-1趟比较,第一次需要比较n-1次,每趟得到一个数据的位置。
上述方法中,供需比较次数为:(1+n-1)*(n-1)/2=n*(n-1)/2。
该方法存在一个弊端,即当给定数组为有序时,算法依然需要比较n*(n-1)/2次。我们可以给定一个标识符,当数据交换位置时,继续下一趟比较;当一趟比较后发现没有发生数据交换,说明已经完成排序。故此时,最好的情况时比较(n-1)次,发现数据为有序的。该方法需要一个记录的辅助空间。
该冒泡方法:
平均情况的时间复杂度 最好情况的时间复杂度 最坏情况的时间复杂度 空间复杂度
O(n^2) O(n) O(n^2) O(1)
代码实现如下:
#ifndef _BUBBLE_H
#define _BUBBLE_H
#include<iostream>
using namespace std;
// 当第i趟循环中,没有发生交换,排序已经完成,排序结束
//所以冒泡排序在最好情况下,进行n次比较,时间复杂度为O(n)
template<typename Type>
void Bubble(Type* a,int n)
{
bool flag;
Type tem;
for(int i=0;i<n-1;i++)
{
flag=false; //数组内数据是否变换位置的标志
for(int j=0;j<n-1-j;j++)
{
if(a[j]>a[j+1])
{
tem=a[j];
a[j]=a[j+1];
a[j+1]=tem;
flag=true;
}
}
if(!flag)//如果flag==false,即数组内数据没有变换位置
break;
}
}
#endif
另一种编程方法
#ifndef _BUBBLE_H
#define _BUBBLE_H
#include<iostream>
using namespace std;
template<class Type>
void Bubble(Type a[],int n)
{
bool exchange=true;
int i=1;
Type tem;
while(exchange)
{
exchange=false;
for(int j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
tem=a[j];
a[j]=a[j+1];
a[j+1]=tem;
exchange=true;
}
}
i++;
}
}
#endif
测试代码:
#include<iostream>
#include"Bubble.h"
using namespace std;
int main()
{
int a[10]={18,23,15,3,8,54,12,54,76,100};
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
Bubble(a,10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}