平常写冒泡排序法时,都是直接两个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; }