题解 | #排序#

排序

https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 将给定数组排序
 * @param arr int整型一维数组 待排序的数组
 * @return int整型一维数组
 */
function MySort(arr) {
    // write code here
    // 利用归并排序
    mergeSort(arr, 0, arr.length - 1);
    return arr;
}
// 定义分递归函数
const mergeSort = function (arr, left, right) {
    // 递归终止条件
    if (left === right) return;
    // 中间值,利用位运算符防止数据溢出,更加安全
    let mid = parseInt(left + ((right - left) >> 1));
    // 递归中间值左边部分
    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr,left,mid,right);
}
//定义治递归函数
const merge = function(arr,left,mid,right){
    // 定义辅助空数组
    const help = [];
    let i = left;
    let j = mid + 1;
    //定义变量h,用于控制help数组中的元素
    let h = 0;
    while (i <= mid && j <= right) {
        help[h++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
    }
    // 将一组比对中的数据都加到help数组中
    while (i <= mid) {
        help[h++] = arr[i++];
    }
    while (j <= right) {
        help[h++] = arr[j++];
    }
    // 将原始数组利用help进行更新
    for (let h = 0; h < help.length; h++) {
        arr[left + h] = help[h];
    }
    return arr;
}
module.exports = {
    MySort: MySort,
};

解题思路

归并排序:时间复杂度为O(n*logn)

该排序算法采用的是分而治之的方法;

(1)分解

将当前数组区间一分为二,求分裂点 mid = (low + high)/2,并递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归分解。分解递归的终结条件是子区间长度为1。

(2)合并

创建辅助数组help,通过比较分组的两个数组中的元素,依次将较小的先入help,将大的后入help;

(3)更新原数组

利用help对原数组进行更新

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务