算法描述
- 比较相邻的元素,如果前面的数大于后面的元素,则交换两个数的位置。第一次遍历后,最大的数会被放到数组的最后位置,即 array[length - 1]。
- 第二次遍历时跳过最后一个元素,因为该元素通过第一次遍历已经确定是最大值。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
动图演示
算法实现
这里需要注意的是两层循环的边界。
第一层循环因为是两两比较,所以最后一个元素已经和前一个元素比较过了,所以就没必要遍历了,所以第一层循环 i < arr.length - 1
。
第二层循环中,后面的 i 个元素已经为排序好的元素了,所以也没必要再遍历了,所以第二层循环 j < arr.length - 1 - i
。
/**
* 交换数组中的两个元素
* @param {number[]} arr
* @param {number} i
* @param {number} j
*/
const swap = (arr, i, j) => {
const temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
/**
* 冒泡排序
* @param {number[]} arr 数值数组
*/
const bubbleSort = (arr) => {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1)
}
}
}
return arr
}
这里的时间复杂度为 o(n^2)
。