//从左往右扫描数据,选择最大的数据放在最右边 //算法:比较相邻的两个数,如果左边的数大于右边的数就进行交换 #include <iostream> using namespace std; void BubbleSort1(int list[], int n); void BubbleSort2(int a[], int n); int main() { int a[] = {45,34,78,12,34,32,29,64,45,23}; cout <<"原始:"<<endl; //原始冒泡排序 BubbleSort1(a,10); for(int k=0;k<10;k++) //输出排序后的数 { cout <<a[k]<<" "; } cout <<endl<<endl; //优化的冒泡排序 cout <<"优化后:"<<endl; BubbleSort2(a, 10); for(int k=0;k<10;k++) //输出排序后的数 { cout <<a[k]<<" "; } cout <<endl; return 0; } //常规的冒泡排序 void BubbleSort1(int list[], int n){ //需要两个循环 //bool Swap; //加标志以后不一定要扫描n-1次 //n=10,i<9,扫描9次 for(int i=0;i<n-1;i++) {//n为元素格式,n个数据扫描n-1遍,10个数是从0到8 //Swap = false; for(int j=0;j<n-i-1;j++){ //n为10,第一遍扫描到8,比较9;第二遍扫描到7,比较8次;第三遍扫描到6,比较7次 if(list[j] > list[j+1]) //如果左边元素大于右边 std::swap(list[j],list[j+1]); //交换 //Swap = true; } /*if(!Swap) return ; */ } } //优化的冒泡排序 void BubbleSort2(int a[], int n){ //a[]为数组,n为数组长度 bool Swap; //标识是否发生交换 for(int i = 0;i<n-1;i++){ //外层扫描,n个数据扫描n-1次 Swap = false; //初始化标识,没有交换时,标识为假 for(int j=n-1;j>i;j--){ //从后往前扫描 if(a[j]<a[j-1]){ //如果右边的数小于左边的数,就交换 std::swap(a[j],a[j-1]); Swap = true; //交换后标识为真 } } if(!Swap) //如果没有发生交换,表示已经排好次序,算法结束 return ; } }
输出结果:
原始:
12 23 29 32 34 34 45 45 64 78
优化后:
12 23 29 32 34 34 45 45 64 78