/**
* 快速排序
* @param {*} arr 排序的数组
* @returns {Array} 新的数组
*/
function quickSort (arr) {
// (1)在数据集之中,选择一个元素作为"基准"(pivot)。
// (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
// (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
if (arr.length <= 1) return arr;
let midIndex = Math.floor(arr.length / 2);
let midVal = arr.splice(midIndex, 1)[0];
let left = [];
let right = [];
for (let index = 0; index < arr.length; index++) {
if (arr[index] < midVal) {
left.push(arr[index])
} else {
right.push(arr[index])
}
}
return quickSort(left).concat([midVal], quickSort(right));
}
/**
* 深拷贝
* @param {*} obj 源数据
* @returns {*} 返回拷贝的对象或数组
*/
function deepClone (obj) {
// 判断是对象还是数组
let newObj = obj instanceof Array ? [] : {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] instanceof Object) {
newObj[key] = deepClone(obj[key])
} else {
newObj[key] = obj[key]
}
}
}
return newObj;
}