冒泡排序(Bubble Sort)
一、算法描述
依次比较数组中的前后两个元素,如果前一个元素大于后者则交换位置,这样每次循环后小的就会出现在前面,直到没有可交换的位置
二、算法实现
- 首先数组中第一个个第二个比较,如果前者大于后者交换位置,否则不交换
- 继续处理步骤一,第二个和第三个元素进行比较
- 继续重复1、2 知道所有元素比较完成
三、具体代码实现
function bubbleSortV1(arr = []) {
if (arr.length === 0) {
return 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]) {
[arr[j + 1], arr[j]] = [arr[j], arr[j + 1]];
}
}
}
return arr;
}
注意:第一版本有个不好的情况,如果最后一次冒泡下标不是结尾元素,但是还是会去走一遍直到结尾,所以我们可以改进,记录最后一次冒泡下标,下次循环到此就终止,没必要继续循环
冒泡升级版
function bubbleSortV2(arr = []) {
if (arr.length === 0) {
return arr;
}
let endIdx = arr.length - 1;
for (let i = 0; i < arr.length - 1; i++) {
let idx = i;
// endIdx 到冒泡结尾处 就ok 说明后面已经排好
for (let j = 0; j < endIdx; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j + 1], arr[j]] = [arr[j], arr[j + 1]];
idx = j;
}
}
endIdx = idx; // 冒泡结尾处
}
return arr;
}
普通冒泡每次只能找到最大值或者最小值,我们可以同时进行,加快排序速度
function bubbleSortV2(arr = []) {
if (arr.length === 0) {
return arr;
}
let left = 0;
let right = arr.length - 1;
while (left < right) {
for (let i = left; i < right; i++) {
if (arr[i] > arr[i + 1]) {
[arr[i + 1], arr[i]] = [arr[i], arr[i + 1]];
}
}
right--;
for (let i = right; i > left; i--) {
if (arr[i] < arr[i - 1]) {
[arr[i - 1], arr[i]] = [arr[i], arr[i - 1]];
}
}
left++;
}
return arr;
}
四、图示