冒泡排序
- 排序的本质是比较和交换
- 通过比较,判断是否需要交换
冒泡排序的原理
-
冒泡排序是通过对一个集合中相邻的两个元素进行比较,然后按照排序的规则(升序\降序),判断是否要交换两个元素的位置实现的
-
以升序为例
- 比较相邻的两项
- 如果前一项比后一项大,则交换两项的位置,接着进行后续的比较
- 如果前一项比后一项小,则不变,进行后续的比较,接着进行后续的比较
- 这样一轮比较下来,就会把大的一个数组排到数组的末尾
- 如图所示:
- 从图中可以看出,经过一次排序可以把最大的数字确定出来
- 再分析,如果再经过一次排序,确定出来的数组应该是7
- 每一次排序都可以找出一个当前乱序中的最大数
- 所以排序的次数应该数当前数组的长度数即可
- 但是考虑到性能问题,每排完一次,数组中的最大数已经确定,因此,确定的位数不需要再进行比较
- 所以,每排完一次,比较的轮数应该减一
-
看源码
// 创建一个要排序的数组
const arr = [5, 2, 4, 7, 1, 9, 0, 3]
/**
* 交换数组中a、b两个位置的元素
* @param {*} arr 要排序的数组
* @param {*} a 数组中的位置a
* @param {*} b 数组中的元素b
*/
const exchange = (arr, a, b) => {
let temp = null // 创建一个变量,暂存数据
temp = arr[a]
arr[a] = arr[b]
arr[b] = temp
}
/**
* 通过比较,判断是否需要交换
* @param {*} a 数值a
* @param {*} b 数值b
*/
const compare = (a, b) => {
if (a > b) { // 如果前一个元素大于后一个元素,
return true
} else {
return false
}
}
const bubbleSort = arr => {
// let temp = null
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (compare(arr[j], arr[j + 1])) {
exchange(arr, j, j + 1)
}
}
// console.log(arr)
}
return arr
}
console.log(bubbleSort(arr))