冒泡排序是一种最简单的排序算法。
基本思想:对于一组数据,从第一个开始,与其右边相邻数据作比较。若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; }