思路:在进行冒泡法排序(升序)时,需要将数组元素(len)两两比较,如果前面的元素大于后面的元素,则交换两个数,否则,比较下一个元素和它的下一个元素的大小,依次执行,执行一次循环,可以找到当前数组中最大的一个元素,然后问题规模变小,然后找出len-1个元素里的最大值,使之成为第二大元素,依次执行,需要在外层嵌套一层循环。
优化:考虑如果数组中的数据已经是排好序的,那么就不需要遍历那么多次,定义一个标志位,如果没有执行交换,则说明数组中的元素已经排好序了,这时直接跳出循环。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
void Swap(int &a, int &b) {
if(&a != &b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}
void bubble_sort(int* a, int length) {
if(a == NULL || length <= 0) {
return;
}
int i,j;
int times = length - 1;
bool flag = false;
for(i = 0; i < times; i++) {
for(j = 0; j < times - i; j++) {
if(a[j] > a[j + 1]) {
flag = true;
Swap(a[j], a[j + 1]);
}
}
if(!flag) {
break;
}
}
}
int main() {
int a[5] = {5, 3, 2, 1, 4};
int len = sizeof(a)/sizeof(int);
bubble_sort(a, len);
for(int i = 0; i < len; i++) {
cout << a[i] <<endl;
}
return 0;
}