1.虽然前端在实际工作中较少用到算法体系,不过最基本的数组排序还是得知道下,特别是冒泡排序和快速排序,这两种排序也是在面试中高频出现,所以本文就以动画和手写的方式来展示这两种最基本的数组排序算法。
2.话不多说,直接上正菜。
- 冒泡排序
let arr = [23, 56, 520, 920, 888, 666];
// 冒泡排序(写法一)
function mp1(arr) {
if (arr.length < 2) {
return arr
} else {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
return arr //一定要return出来,不然就是undefined
}
}
console.log(mp1(arr)); //打印 [23, 56, 520, 666, 888, 920]
let arr = [23, 56, 520, 920, 888, 666];
// 冒泡排序(写法二)
function mp2(arr) {
if (arr.length < 2) {
return arr
} else {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}
}
return arr
}
}
console.log(mp2(arr)); //打印 [23, 56, 520, 666, 888, 920]
- 快排
let arr = [23, 56, 520, 920, 888, 666];
// 快排(写法一)
function findMid(arr, left, right) {
let x = arr[left];
let i = left;
let j = right;
while (i < j) {
//先从前往后找小的,没找的的话一直继续
while (i < j && arr[j] > x) {
j--;
}
//找到了,将值填入坑里面,a[j]又变成了坑
if (i < j) {
arr[i] = arr[j];
}
//然后从前往后找大的,没找到继续找。
while (i < j && arr[i] < x) {
i++;
}
//找到了,将值填入之前的坑里。
if (i < j) {
arr[j] = arr[i]
}
}
//将基准值填入坑
arr[i] = x;
return i;
}
function kp1(arr, left, right) {
let length = arr.length;
let start = left || 0;
let end = right !== undefined ? right : length - 1;
if (start < end) {
let index = findMid(arr, start, end)
kp1(arr, start, index - 1); //调整基准值左边
kp1(arr, index + 1, end); //调整基准值右边
}
return arr;
}
console.log(kp1(arr)); //打印 [23, 56, 520, 666, 888, 920]
let arr = [23, 56, 520, 920, 888, 666];
// 快排(写法二)
function kp2(arr) {
if (arr.length <= 1) {
return arr;
}
let leftArr = [];
let rightArr = [];
let q = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > q) {
rightArr.push(arr[i])
} else {
leftArr.push(arr[i])
}
}
return [].concat(kp2(leftArr), [q], kp2(rightArr));
}
console.log(kp2(arr)); //打印 [23, 56, 520, 666, 888, 920]