(C++)数据结构排序---冒泡排序

冒泡排序是一种最简单的排序算法。

基本思想:对于一组数据,从第一个开始,与其右边相邻数据作比较。若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;
}

猜你喜欢

转载自blog.csdn.net/qq_40951833/article/details/80751741