虽然在工作中,写排序、查找等数组操作,网上很容易找,但是那不是自己的,当面试的时候就不会咯。还有就是面对数组高阶操作,ES6新特性也嫩一理解其中逻辑,源码也读不懂。(都是大学没好好学习,出来混的,总要还的--春哥语录)
一、排序算法是什么?
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律。(百度)
-- 遍历数据结构的规律
二、排序算法
1.快速排序
快速排序是一种划分交换排序。它采用了一种分治的策略,通常称其为分治法。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
该方法的基本思想是:
- 1.先从数列中取出一个数作为基准数。
- 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 3.再对左右区间重复第二步,直到各区间只有一个数。
quickSort(array) {
console.log('快速排序')
console.log(array)
const sort = (arr, left = 0, right = arr.length - 1) => {
// 如果左边的索引大于等于右边的索引,说明整理完毕
if (left >= right) return
let i = left
let j = right
// 取无序数组最后一个数为基准值
const baseVal = arr[j]
// 把所有比基准值小的数放在左边大的数放在右边
while (i < j) {
while (i < j && arr[i] <= baseVal) {
// 找到一个比基准值大的数交换
i++
}
// 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己(i 等于 j)
arr[j] = arr[i]
while (j > i && arr[j] >= baseVal) {
// 找到一个比基准值小的数交换
j--
}
// 将较小的值放在左边如果没有找到比基准值小的数就是将自己赋值给自己(i 等于 j)
arr[i] = arr[j]
}
// 将基准值放至中央位置完成一次循环(这时候 j 等于 i )
arr[j] = baseVal
// 将左边的无序数组重复上面的操作
sort(arr, left, j - 1)
// 将右边的无序数组重复上面的操作
sort(arr, j + 1, right)
}
// 为了保证这个函数是纯函数拷贝一次数组
const newArr = array.concat()
sort(newArr)
console.log(newArr)
return newArr
}
总结
都是网上找到的内容,站在巨人的肩膀上学习。。。
以上是关于排序算法到快速排序的一些学习记录,多多学习!加油