复制以下代码:
/** 归并排序 稳定性好,速度快,适用大量数据,代价是需要给每一个临时数组额外的内存空间
* @array 待排序数组
* @field 依据字段
* @sort 正反序 0 正序 1 倒叙
*/
export function mergeSort({ array = [], field = '', sort = 0 }) {
const _merge = (arr) =>{//拆分
if (arr.length < 2) return arr;
let left = arr.slice(0, Math.floor(arr.length / 2)),
right = arr.slice(Math.floor(arr.length / 2));
return _sort(_merge(left), _merge(right)) //里面采用递归
}
const _sort = (left,right) => {//排序
let result = []
let nleft,nright;
let sortRes;
while(left.length && right.length) {
// 取出对比数值
if(field) {
nleft = left[0][field];
nright = right[0][field];
}else{
nleft = left[0];
nright = right[0]
}
// 特殊格式对比
if (!Is('number',Number(nleft)) && Is('number',Date.parse(nleft))) { //如果可以转成日期时间戳
sortRes = Date.parse(nleft) < Date.parse(nright);
} else if (Is('string', nleft)) { //汉字的比较
sortRes = nleft.localeCompare(nright) < 0;
} else { //数字的比较
sortRes = nleft < nright;
}
// 正反序排列--这里shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
if((sortRes && !sort) || (!sortRes && sort)) {
result.push(left.shift())
}else {
result.push(right.shift())
}
}
return result.concat(left , right)
}
return _merge(array);
}