“冒泡排序”又称“气泡排序”,基本思路是:每次将相邻两个数比较,将小的调到前面,每一趟比较就得到一个较大或较小的数,如果有n个数,则要进行n-1趟比较。可以有升序和降序两种排序方式,就升序来说,既可以从前向后冒,这样的话就是找最大值,又可以从后向前冒,这样便是找最小值。
下面便向大家展示升序的找最小和找最大的两种方式。
从后向前冒(找最小):
#include <stdio.h>
#include <stdlib.h>
// 升序:从小到大 降序:从大到小
// 找最大:从前往后冒 找最小:从后往前冒
void Swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
void BubbleSort(int* arr, int size) {
// [0,bound)已排序区间 [bound,size)未排序区间
int bound = 0;
for (; bound < size; ++bound) {
// 找最小值
int cur = size - 1;
for (; cur > bound; --cur) {
if (arr[cur - 1] > arr[cur]) {
Swap(&arr[cur - 1], &arr[cur]);
}
}
}
}
int main() {
// 数组作为函数的参数时会隐式转换成指针,指向数组的首元素
// 在函数外部将数组长度求好然后当做参数传到函数里面
int arr[] = { 3, 8, 5, 9, 2, 0 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size);
for (int i = 0; i < size; i++) {
printf("%d\n", arr[i]);
}
system("pause");
return 0;
}
从前向后冒(找最大):
#include <stdio.h>
#include <stdlib.h>
void Swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
void BubbleSort(int arr[], int size) {
// 升序(从前往后冒:找最大)
// [0, bound) 未排序区间 [bound, size] 已排序区间
int bound = size;
for (; bound > 0; bound--) {
int cur = 1;
for (; cur < bound; cur++) {
if (arr[cur - 1] > arr[cur]) {
Swap(&arr[cur - 1], &arr[cur]);
}
}
}
}
int main() {
int arr[] = { 3, 6, 8, 5, 0, 1, 2, 7 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size);
for (int i = 0; i < size; i++) {
printf("%d\n", arr[i]);
}
system("pause");
return 0;
}