C++冒泡排序练习
#include<iostream> #include<string> #include<ctime> using namespace std; #define max 100000 void Bubble(int arr[]); int main() { //int arr[6]={5,4,8,7,2,6}; srand((unsigned int)time(NULL)); int arr[max]; for (int i = 0; i < max; i++) { arr[i]=rand()%max;//0~999 } for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { cout<<"arr["<<i<<"]"<<"="<<arr[i]<<endl; } cout<<endl; Bubble(arr); for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { cout<<"arr["<<i<<"]"<<"="<<arr[i]<<endl; } return 0; } void Bubble(int arr[]) { int flag=0; //设置一个flag,判断如果从第某次开始就没有交换就不需要继续验证后面的了 for (int j = 0; j < max; j++) //max可以通过宏来方便改写 { for (int i = 0; i < max-j; i++) //i为max-1时 max+1=6会出现越界,导致栈溢出(但是C++编译器不会检测是否有越界因为为了让程序跑的很快),且冒泡排序是先排正确末尾数据开始的,max-j可以减少程序运算次数 { if (arr[i]>arr[i+1]) { flag =1; int temp=arr[i+1]; arr[i+1]=arr[i]; arr[i]=temp; } } if (flag==0) { break; } } }
在里面做了两处优化:
第一种是因为冒泡排序的原理是数列最后的数字最先排好,所以每次排好一个数字就可以减少一位对比运算 通过i<max-j;
第二种是在内循环过程中如果已经对比了是正确顺序,说明这个数列的顺序是对的那就直接跳出这个外循环结束排序,减少程序运算次数,通过加入flag;
还可以通过加法的方式不创建第三个变量进行两个变量的交换例如:
a=a+b; b=a-b; a=a-b;

浙公网安备 33010602011771号