function insertSort(arr, sortByFn) {
for (let i = 1; i < arr.length; i++) {
let temp1=arr[i];
let temp = sortByFn(arr, i);
let j = i - 1;
while (j >= 0 && sortByFn(arr, j) > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp1;
}
return arr;
}
function quickSort(arr, left, right, defaultSortByFn) {
let stack = [[left, right]];
while (stack.length > 0) {
const now = stack.pop();
let right = now[1];
let left = now[0];
let index = partition(arr, left, right, defaultSortByFn);
if (left < index - 1) {
stack.push([left, index - 1]);
}
if (right > index + 1) {
stack.push([index + 1, right]);
}
}
return arr;
}
function partition(arr, left, right, sortByFn) {
let base1=arr[left];
let base = sortByFn(arr, left);
while (left < right) {
while (left < right && base <= sortByFn(arr, right)) {
right--;
}
arr[left] = arr[right];
while (left < right && base >= sortByFn(arr, left)) {
left++;
}
arr[right] = arr[left];
}
arr[left] = base1;
return left;
}
const defaultSortByFn = function(arr, index) {
return arr[index];
};
function sortBy(arr, sortByFn = defaultSortByFn) {
let len;
let result;
if (!(Array.isArray(arr) && ((len = arr.length), len) > 1)) return arr;
if (len <= 100) {
console.time("插入排序");
result = insertSort(arr, sortByFn);
console.timeEnd("插入排序");
} else {
console.time("快速排序");
result = quickSort(arr, 0, len - 1, sortByFn);
console.timeEnd("快速排序");
}
return result;
}