一、 归并排序(merge sort)
主要思路为 将数组分两部分,左边的排好序,右边的排好序,然后再合并到一起(merge)
function mergeSort(arr){
let len=arr.length;
if(len===1) return arr;
let left=arr.slice(0,Math.ceil(len/2));
let right=arr.slice(Math.ceil(len/2));
return merge(MergeSort(left),MergeSort(right));
}
function merge(left,right){
if(left===null) return right;
if(right===null) return left;
if(left[0]<right[0]){
return [left[0]].concat(merge(left.slice(1),right));
}else{
return [right[0]].concat(merge(left,right.slice(1)));
}
}
二、 快速排序(quick sort)
主要思路为先取中点,然后遍历,比中点值小的排到中点左边,比中点大的排到右边,然后递归一下中点左边的子数组和中点右边的子数组。(注意,递归一定要写出口,否则会爆栈!)
function quickSort(arr){
if(arr.length===0 || arr.length===1) return arr;
}
let mid=Math.ceil(arr.length/2);
let midPoint=arr[mid];
arr.splice(mid,1);
let left=[],right=[];
for(let item of arr){
item<=midPoint?left.push(item):right.push(item);
}
return [].concat(quickSort(left),midPoint,quickSort(right));