冒泡排序
时间复杂度\(\mathrm{O}(n^2)\)
冒泡算法思路如图所示
两两比较相邻的两个元素,如果逆序就交换
//这里使用的方法是从开头将大的元素一个个往后放,
//有些也可能是从后面开始将小的元素一个个往前顶
void bubbleSort(int *a, size_t size) {
for (int i = size - 1; i > 0; --i) {
for (int j = 0; j < i; ++j) {
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}
}
算法改进一
当一趟排序没有发生任何交换操作时,则此段元素就是有序的,布尔类型的sorted就用来指示是否有序
void bubbleSortA(int *a, size_t size) {
bool sorted;
for (int i = size - 1; i > 0; --i) {
sorted = true;
for (int j = 0; j < i; ++j) {
if (a[j] > a[j + 1]) {
sorted = false;
swap(a[j], a[j + 1]);
}
}
if (sorted)
return;
}
}
算法改进二
经过几次排序后,可能有些片段会变得有序,用last表示从last开始后面都是有序的
void bubbleSortB(int *a, size_t size) {
size_t last;
for (int i = size - 1; i > 0; ){
last = 0;
for (int j = 0; j < i; ++j) {
if (a[j] > a[j + 1]) {
last = j + 1;
swap(a[j], a[j + 1]);
}
}
i = last;
}
}