分成多趟,每趟:从头到尾两两比较,顺序不符合的交换一下位置。
A | B | C | D | E | F |
基础算法:
每一趟:A位置和B位置比较,若满足条件,A和B位置的数进行交换;然后B位置和C位置做同样的操作;依次循环到数组末尾。
第一趟:将最大或最小的数交换到最后。
第二趟:将次大或次小的数交换到倒数第二位置。
优化:
每一趟中,最后交换过的位置之后的数据都排好序了,下一趟只需要比较到这个位置即可。
最终代码
// 冒泡排序
void MaoPaoSort(int arrayData[], int arraySize)
{
int i, j;
int endCmpIdx = arraySize - 2;
for (i = 0; i < arraySize; i++) {
int lastChg = -1;
for (j = 0; j <= endCmpIdx; j++) { // 只需要循环到上一轮最后交换过的位置
if (arrayData[j] > arrayData[j + 1]) {
int tmpData = arrayData[j];
arrayData[j] = arrayData[j + 1];
arrayData[j + 1] = tmpData;
lastChg = j; // 记录发生交换的位置
}
}
if (lastChg == -1) {
break;
} else {
endCmpIdx = lastChg;
}
}
}