二分法把数组分成一个新的数组,其中每个元素都是数组;
然后两个一组比较大小牌序返回一个合并的数组;
两个数组一组比较大小牌序返回一个合并的数组;
最后返回一个数组;
function sliceArr(arr) {
// 数组长度小于2就不处理,解决奇数长度问题
if (arr.length<2) {
return arr;
}
let res = [];
let i = 0;
let j = Math.floor(arr.length/2); // 向下取整获取一半数组长度
// 递归分裂数组
res = mergeArr(sliceArr(arr.slice(0,j)),sliceArr(arr.slice(j,arr.length)));
return res;
}
function mergeArr(arr1,arr2) {
let arr = [];
// 比较两个数组第一个元素,小的push进去
while(arr1.length && arr2.length) {
if (arr1[0]>arr2[0]) {
arr.push(arr2.shift());
} else {
arr.push(arr1.shift());
}
}
//一个数组已经清空,另一个数组是之前排列好的直接push
while (arr1.length) arr.push(arr1.shift());
while (arr2.length) arr.push(arr2.shift());
return arr;
}
let n = 10;
let a = [];
while (n--) {
a.push(Math.floor(Math.random()*100));
}
console.log(a)
console.log(sliceArr(a))