js冒泡排序函数手写代码,附详细注释和测试
下面是一个手写的 JavaScript 冒泡排序函数,附有详细的注释和测试用例。
javascript
/
冒泡排序函数
@param {Array} arr - 需要排序的数组
@return {Array} - 排序后的数组
/
function bubbleSort(arr) {
// 获取数组的长度
let n = arr.length;
// 外层循环,控制排序的趟数
for (let i = 0; i < n - 1; i++) {
// 内层循环,进行相邻元素的比较和交换
for (let j = 0; j < n - 1 - i; j++) {
// 比较相邻的两个元素
if (arr[j] > arr[j + 1]) {
// 如果左边的元素大于右边的元素,交换它们的位置
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// 每趟排序后,最大的元素会被放到数组的末尾
console.log(`第 ${i + 1} 趟排序后的数组:`, arr);
}
// 返回排序后的数组
return arr;
}
// 测试用例
const testArray = [64, 34, 25, 12, 22, 11, 90];
console.log("原始数组:", testArray);
const sortedArray = bubbleSort(testArray);
console.log("排序后的数组:", sortedArray);
详细注释
1. 函数定义:
javascript
function bubbleSort(arr) {
定义一个名为 `bubbleSort` 的函数,接受一个数组 `arr` 作为参数。
2. 获取数组长度:
javascript
let n = arr.length;
获取数组的长度,并将其存储在变量 `n` 中。
3. 外层循环:
javascript
for (let i = 0; i < n - 1; i++) {
外层循环控制排序的趟数。总共需要排序 `n - 1` 趟,因为每趟排序会将最大的元素放到数组的末尾。
4. 内层循环:
javascript
for (let j = 0; j < n - 1 - i; j++) {
内层循环进行相邻元素的比较和交换。随着排序的进行,最大的元素会被逐渐移动到数组的末尾,因此每次内层循环的范围可以逐渐减小。
5. 比较和交换:
javascript
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
比较相邻的两个元素 `arr[j]` 和 `arr[j + 1]`。如果左边的元素大于右边的元素,则交换它们的位置。
6. 打印每趟排序后的数组:
javascript
console.log(`第 ${i + 1} 趟排序后的数组:`, arr);
打印每趟排序后的数组,以便观察排序过程。
7. 返回排序后的数组:
javascript
return arr;
返回排序后的数组。
测试用例
javascript
const testArray = [64, 34, 25, 12, 22, 11, 90];
console.log("原始数组:", testArray);
const sortedArray = bubbleSort(testArray);
console.log("排序后的数组:", sortedArray);
输出
原始数组: [ 64, 34, 25, 12, 22, 11, 90 ]
第 1 趟排序后的数组: [ 34, 25, 12, 22, 11, 64, 90 ]
第 2 趟排序后的数组: [ 25, 12, 22, 11, 34, 64, 90 ]
第 3 趟排序后的数组: [ 12, 22, 11, 25, 34, 64, 90 ]
第 4 趟排序后的数组: [ 12, 11, 22, 25, 34, 64, 90 ]
第 5 趟排序后的数组: [ 11, 12, 22, 25, 34, 64, 90 ]
第 6 趟排序后的数组: [ 11, 12, 22, 25, 34, 64, 90 ]
排序后的数组: [ 11, 12, 22, 25, 34, 64, 90 ]
通过这个测试用例,我们可以看到原始数组 `[64, 34, 25, 12, 22, 11, 90]` 经过冒泡排序后变成了 `[11, 12, 22, 25, 34, 64, 90]`。每趟排序后的数组也被打印出来,以便观察排序过程。
