不会吧,不会吧,不会真有人开始春招了还不会快排?
如果你还真不会,那请花上五分钟,让我带你5分钟解析JS快排!
1. 算法思想
- 快排是典型的分治法基础,其思想是将一个极其庞大的任务不断分成小碎片,然后同时将小碎片逐个击破,达到快速完成的目的。
- 其步骤大概可以分为:选取基点-分区-再操作-拼接 四个部分
- 选取基点 排序是需要进行比较的,而基点就是我们比较的基准,也是分区的重要一环,而大家习惯性的喜欢选取C位元素
- 分区 将和基点比较的结果分类存放,比较结束后将两个分区进行再次分区,也就是上述中的再操作,直至无法满足再操作
- 连接 快排的结果其实是无数个小碎片,我们需要将其全部连接起来才可以得到正确结果
2. 手撕代码
/**
* @author 江河丶
* @param {nums[]} Array
* @return Array
*/
function quickSort(nums) {
// 传进来的数组如果如果为空或者只有一个元素,则直接返回
if (nums.length < 2) {
return nums;
}
// 快排核心代码
// 选择中间元素作为快排的基点,获取基点的下标,待会需要取出
let centerIndex = Math.floor(nums.length / 2);
// 因为返回的是一个数组,使用0下标直接取用
const centerNum = nums.splice(centerIndex, 1)[0];
// 定义左右两个空数组,用于分区
const left = [];
const right = [];
// 遍历数组
nums.forEach(item => {
// 如果元素大于基点,就存入右边,否则存入左边
if (item > centerNum) {
right.push(item);
} else {
left.push(item);
}
})
// 使用递归调用,同时对左右两个分区进行快排,后面裂变后速度将极快
// 将其连接,基点一定是放在中间的,很多人快排失败很可能是因为基点位置放错了
return quickSort(left).concat(centerNum, quickSort(right));
}
3. 写在最后
- 快速排序最重要的是理解其究竟快在哪里?同时需要理解一下分治法的思想,如何将一个庞大的计算任务切割成许许多多的小块来进行
- 很多小伙伴认为学习了前端就算法知识不重要了,直到面试时候才发现自己已经连最基本的数据结构和算法都忘了
- 学习算法一直认为是一个一次投入,终身受益的事情,哪怕是学习前端也不能丢了算法。因为面试时算法就是一道分水岭,其考察的不仅仅是一道算法,还有个人的思维方式和应变能力考验,同时可以看出一个人极限编程能力。