快速排序和二分排序
快速排序也是一种分而治之的方法,将原始数组分为较小的数组(但它没有像归并排序那样将它们分割开)
大体思路就是先分区后递归
分区:从数组中任意选择一个“基准”,所有比基准小的元素放在基准前面,比基准大的元素放在基准后面。
递归:递归地对基准前后的子数组进行分区处理
function (array){
const rec = (arr) => {
if(arr.length === 1){
return array
}
const left = [];
const right = [];
const mid = arr[0];
for(let i = 1; i < arr.length; i += 1){
if(arr[i] < mid){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return [...rec(left), mid, ...rec(right)]
};
const res = rec(array);
res.forEach((n, i)=> { this[i] = n})
}
二分搜索的前提是数组有序的,思路是从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束。如果目标值大于或者小于中间元素,则大于或者小于中间元素的那一半数组中搜索
//二分查找
Array.prototype.binarySearch = function(item){
let low = 0;
let high = this.length - 1;
while(low <= high){
const mid = Math.floor((low + high) / 2);
const element = this[mid];
if(element < item){
low = mid + 1;
}else if(element > item){
high = mid - 1;
}else {
return mid
}
}
return -1;
}
参考: 慕课网和Javascript数据结构和算法