用javascript来实现sort

62 阅读1分钟
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)