冒泡排序改进

来源:互联网 发布:雷欧奥特曼mac装备 编辑:程序博客网 时间:2024/05/21 22:43

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

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

就可以跳出循环了。

代码如下:

/*Filename:bubleSort.cppAuthor: xiaobingE-mail: xiaobingzhang29@gmail.comDate: 2013-08-25*/#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#define N 10using 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;}


原创粉丝点击