冒泡排序
2024年12月10日大约 2 分钟
练习循环嵌套,if比较,数组替换
// 定义一个数组,包含一组需要排序的数字
let text_arr = [8, 6, 5, 9, 7, 4, 3, 1, 2, 0];
// 初始化日志参数 log_arr1,用于记录内循环的执行次数
let log_arr1 = 0;
// 初始化日志参数 log_arr2,用于记录外循环的迭代次数
let log_arr2 = [];
// 外层循环控制冒泡排序的总轮数,循环次数为数组长度减 1
for (let i = 0; i < text_arr.length - 1; i++) {
// 内层循环用于比较和交换相邻的元素
for (let e = 0; e < text_arr.length - i - 1; e++) {
// 如果当前元素大于下一个元素,则进行交换
if (text_arr[e] > text_arr[e + 1]) {
let tmp_number = text_arr[e]; // 临时变量,存储当前元素
// 更新内循环日志 log_arr1,记录剩余待比较的元素个数
log_arr1 = text_arr.length - i - 1;
// 交换两个元素的位置
text_arr[e] = text_arr[e + 1];
text_arr[e + 1] = tmp_number;
}
}
/**
* 输出当前内循环的执行次数 log_arr1
* 并将 log_arr1 重置为空数组以便下一轮使用
*/
console.log(`内嵌循环执行${log_arr1}次`);
log_arr1 = [];
// 将当前外循环的迭代次数记录到 log_arr2
log_arr2.push(i);
}
// 输出外循环的执行次数记录 log_arr2
console.log(`外循环执行${log_arr2}`);
// 清空 log_arr2,用于后续操作
log_arr2 = [];
// 输出最终排序完成的数组
console.log(text_arr);代码执行逻辑:
初始化变量:
text_arr是需要排序的原始数组。log_arr1和log_arr2分别用于记录内循环和外循环的日志。
冒泡排序的核心逻辑:
- 外层循环遍历数组,确定需要冒泡的轮次,总轮次为
数组长度 - 1。 - 内层循环每轮比较未排序部分的相邻元素,并根据大小交换位置。
- 每次内层循环后,最大(或最小)值会冒泡到未排序部分的最后位置。
- 外层循环遍历数组,确定需要冒泡的轮次,总轮次为
日志记录与输出:
- 在每次内层循环后,输出当前内层循环的比较次数
log_arr1。 - 在每次外层循环后,将外循环的迭代次数存储到
log_arr2,并最终输出。
- 在每次内层循环后,输出当前内层循环的比较次数
最终结果:
- 输出排序完成的数组
text_arr。 - 输出外循环和内循环的日志,便于理解排序过程。
- 输出排序完成的数组
完整网页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let text_arr = [8, 6, 5, 9, 7, 4, 3, 1, 2, 0];
let log_arr1 = 0;
let log_arr2 = [];
for (let i = 0; i < text_arr.length - 1; i++) {
for (let e = 0; e < text_arr.length - i - 1; e++) {
if (text_arr[e] > text_arr[e + 1]) {
let tmp_number = text_arr[e];
log_arr1 = text_arr.length - i - 1;
text_arr[e] = text_arr[e + 1];
text_arr[e + 1] = tmp_number;
}
}
console.log(`内嵌循环执行${log_arr1}次`);
log_arr1 = [];
log_arr2.push(i);
}
console.log(`外循环执行${log_arr2}`);
log_arr2 = [];
console.log(text_arr);
</script>
</body>
</html>彩蛋
text_arr.sort()