源码+注释
//
// Created by Lenovo on 2021-11-18-下午 4:01.
// 作者:小象
// 版本:1.0
//
#include <stdio.h>
#define LENGTH(arr) (sizeof(arr)/sizeof((arr)[0]))
/**
* <h2>冒泡排序</h2>
* @return 0
*/
int main() {
/*
* 通过对待排序序列从后向前(从下标较大的元素开始),
* 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部
*
* 一个实例:我们将五个无序数字:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列
*/
int arr[] = {1, 2, 80, 57, 13};
int len = LENGTH(arr);
int temp = 0;
for (int i = 0; i < len - 1; i++) { // 外层循环:轮次
int index = -1;
for (int j = 0; j < len - 1 - i; j++) { // 内层循环:比较并交换位置(找出每轮最大数)
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
index++;
}
}
if (index == -1) {
printf("\n在第%d轮排序中跳出\n", (i + 1));
break; // 为提高排序效率,如果在每轮排序中未发生一次位置交换则代表已经是需要的顺序(直接跳出排序)
}
printf("\n第%d轮排序\n", (i + 1));
for (int j = 0; j < len; j++) { // 冒泡排序本质(规律):一共循环 len-1 轮,每轮找出一个
// 最大数(找出的最大数不再参与排序),每轮相邻两个数比较次数比上一轮 -1
printf("%d ", arr[j]);
}
}
printf("\n冒泡排序后的arr:\n");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}