相邻的两个元素进行大小比较,前>后交换
void maopao(int* arr, int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {//如果前者比后者大
//交换两个值
arr[j] = arr[j] ^ arr[j + 1];
arr[j+1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
}
}
}
}
优化:
标记上一次最后交换的位置,下次遍历到他就可以结束了
void maopao(int* arr, int len) {
int i;
int j;
int Flag;
for (i = 0; i < len - 1; i++) {
Flag = 0;//Flag可以用于减少循环次数,最后一次交换的位置之后都是有序的无需再去判断
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {//如果前者比后者大
//交换两个值
arr[j] = arr[j] ^ arr[j + 1];
arr[j+1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
Flag = j + 1;//标记最后一次交换的位置
}
}
if (Flag == 0)break;//说明是有序了,退出循环
i = len - Flag - 1;//更新i -1是因为下一次循环会+1
//最后一次循环的位置越靠前,减少循环的次数越多
}
}