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