var arr = [1, 3, 2];
arr.sort((a, b) => b - a); // 3 2 1
排序以归并排序为例,先实现一个从小到大排序的归并排序
Array.prototype._sort = function() {
function mergeSort(arr, start, end) {
if (start >= end) return;
const middle = (start + end) >> 1;
mergeSort(arr, start, middle);
mergeSort(arr, middle + 1, end);
let res = [], k = 0;
let i = start, j = middle + 1;
while(i <= middle && j <= end) {
if (arr[i] < arr[j]) res[k++] = arr[i++];
else res[k++] = arr[j++];
}
while(i <= middle) res[k++] = arr[i++];
while(j <= end) res[k++] = arr[j++];
i = start, k = 0;
while(i <= end) arr[i++] = res[k++];
}
mergeSort(this, 0, this.length - 1);
return this;
}
最后添加回调函数,通过回调函数执行的结果来返回
Array.prototype._sort = function(callback = (a, b) => a - b) {
function mergeSort(arr, start, end) {
if (start >= end) return;
const middle = (start + end) >> 1;
mergeSort(arr, start, middle);
mergeSort(arr, middle + 1, end);
let res = [], k = 0;
let i = start, j = middle + 1;
while(i <= middle && j <= end) {
if (callback(arr[i], arr[j]) < 0) res[k++] = arr[i++];
else res[k++] = arr[j++];
}
while(i <= middle) res[k++] = arr[i++];
while(j <= end) res[k++] = arr[j++];
i = start, k = 0;
while(i <= end) arr[i++] = res[k++];
}
mergeSort(this, 0, this.length - 1);
return this;
}
调用例子如下:
[{x:1}, {x: 3}, {x: 2}]._sort((a, b) => a.x - b.x)