Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
虽说目前本人实际业务开发中基本遇见手写排序的场景,但是面试造火箭,还是很有可能会被问到的。这里总结一下常见的排序方法:
1、冒泡排序
冒泡排序的原理如下:
- 从第一个元素开始,把当前元素和下一个索引元素进行比较。如果当前元素大,那么就交换位置,重复操作直到比较到最后一个元素,那么此时最后一个元素就是该数组中最大的数。
- 下一轮重复以上操作,但是此时最后一个元素已经是最大数了,所以不需要再比较最后一个元素,只需要比较到
length - 1的位置。
function bubbleSort(list) {
let n = list.length;
if (!n) {
return []
}
// 两层循环
for(let i=0; i<n; i++) {
// 外层循环排序整个list
for(let j=0; j<n-i-1;j++) {
// 内层循环排序外层循环i前的所有值
if (list[j] > list[j+1]) {
[list[j], list[j+1]] = [list[j+1], list[j]]
}
}
}
return list
}
2、快速排序
快排的原理如下:
- 随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。
- 比基准值小的放数组左边,大的放右边,对比完成后将基准值和第一个比基准值大的值交换位置。
- 然后将数组以基准值的位置分为两部分,继续递归以上操作
function quickSort(list) {
let n = list.length;
if (n <= 1) return list;
let midIndex = Math.floor(n/2); // 获取中间index
let midVal = list[midIndex]; // 获取中间值
let left = [], right = [];
for(var i=0; i<n; i++){
if (i===midIndex) continue;
if (list[i] < midVal) {
left.push(list[i]);
} else {
right.push(list[i]);
}
}
// 递归排序
return quickSort(left).concat([midVal], quickSort(right));
}