冒泡排序改进

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

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

就可以跳出循环了。

代码如下:

 

/*
	Filename:bubleSort.cpp
	Author: xiaobing
	E-mail: xiaobingzhang29@gmail.com
	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;
}


 

 

posted on 2013-08-25 20:47  you Richer  阅读(238)  评论(0编辑  收藏  举报