冒泡排序改进

平常写冒泡排序法时,都是直接两个for循环就搞定了,但这其实还是可以优化一下的,

可以在某一次遍历过程中,如果没有发现数据进行交换,则可以确定排序已经完成,这样

就可以跳出循环了。

代码如下:

 

/*

	Filename:bubleSort.cpp

	Author: xiaobing

	E-mail: [email protected]

	Date: 2013-08-25

*/

#include<iostream>

#include<string>

#include<algorithm>

#include<cstdlib>

#define N 10

using namespace std;



/* 冒泡排序法 */

void Bublesort(int a[],int n)

{

     int i,j,k;

     for(j=0;j<n;j++)   /* 气泡法要排序n次*/

     {

          for(i=0;i<n-j-1;i++)  /* 值比较大的元素沉下去后,只把剩下的元素中的最大值再沉下去就可以啦 */

          {

               if(a[i]>a[i+1])  /* 把值比较大的元素沉到底 */

               {

                    k=a[i];

                    a[i]=a[i+1];

                    a[i+1]=k;

               }

          }

     }

}



void myBublesort(int a[], int n){

	int i,j,temp;

	int flag = 2; //表示是否一次遍历比较后没有变换,则可终止比较

	for(i=0;i < n;i++){

		for(j = i+1;j < n;j++){

			if(a[j-1] > a[j] ){

				temp = a[j];

				a[j] = a[j-1];

				a[j-1] = temp;

				flag = 0;		//如果发生交换,则将flag置为0,表示还需要排序



			}



		}



		if(flag == 0){	//这里是当有交换则重新对flag赋值,来记录下一次遍历比较

			flag = 2;

		} else if (flag == 2){	//如果没有发生交换,说明已排好了

			flag = 1;

		}





		if(flag == 1){ //退出排序 

			break; 

		}

	}

}



void print(int a[], int n){



	int i;

	for(i = 0;i < n;i++){

		cout<<a[i]<<" ";

	}

	cout<<endl;

}

int main(){

	int a[N] = {2,4,2,4l,34,4,3,535,65,54};		

	int f[N] = {0,1,2,3,4,5,6,7,8,9};

	//Bublesort(a, 10);

	myBublesort(a,N);

	print(a, N);



	myBublesort(f,N);

	print(f, N);

    return 0;

}


 

 

你可能感兴趣的:(冒泡排序)