这周看一下算法题
1. 快排算法
思路:取数组的中间值,用splice方法从数组中剔除,创建两个数组对象,left和right,对处理的数组循环,值比中间数小的推入left数组,大的推入right数组,然后递归left和right
var arr = [2,1,23,12,11,44,66]
function quickSort (arr) {
if (arr.length < 2) return arr
var left = []
var right = []
var ponitIndex = Math.floor(arr.length/2)
var point = arr[ponitIndex]
arr.splice(ponitIndex, 1)
for (var i=0; i<arr.length; i++) {
if (arr[i] < point) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return res = quickSort(left).concat(point, quickSort(right))
}
console.log(quickSort(arr))
结果:

2. 给定一个数num,在一个数组中找到所有两个数之和等于num的数的下标
思路:先将数组去重排序,分别给数组两个指针指向头部最小的值和尾部最大值,将两值加起来和指定值做比较,大了就尾部向前进一位,小了头部向后进一位,相等返回坐标,然后头尾都向中间进一位继续查找,以此类推,找不到则返回-1
let array = [1, 9, 2, 7, 10, 11, 5, 6, 4, 2, 4, 5]
let sum = 10
// 先去重
let _arr = new Set(array)
_arr = [..._arr]
// 再排序
_arr = _arr.sort((a, b) => {
return a - b
})
function getSum (arr, sum) {
if (arr == '' || arr.length == 0) return
let left = 0
let right = arr.length - 1
while (left < right) {
let _sum = arr[left] + arr[right]
if (_sum > sum) {
right--
} else if (_sum < sum) {
left++
} else if (_sum == sum) {
console.log(left, right)
left++
right--
} else {
return (-1, -1)
}
}
}
getSum(_arr, sum)
结果:

3. 洗牌算法
思路:在循环中取随机数,利用const的不可变性,让当前的值与下标是随机数的值对换
var arr = [1,2,3,4,5,6,7,8]
function shuffle(arr) {
let _arr = arr.concat()
for (let i=_arr.length; i--; i>=0) {
// 使用const 使之不可变
const j = Math.floor(Math.random() * (i+1) )
const temp = _arr[i]
_arr[i] = _arr[j]
_arr[j] = temp
}
return _arr
}
console.log(shuffle(arr))
结果:
