You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript实现归并排序结果丢失半数元素,求原因分析

归并排序实现丢失半数元素的问题分析与修复

问题根源

你的代码在拆分数组时出现了关键错误:

const second:number[] = mergeSort(arr.slice(half + 1));

Array.slice(start, end)的start参数表示截取的起始索引,当只传入一个参数时,会从该索引开始截取到数组末尾。你这里写了half + 1,会跳过索引为half的元素,递归拆分的每一层都会丢失一个元素,最终导致输出只剩原数组的半数元素。

正确的拆分逻辑应该是从half索引开始截取到数组末尾,无需加+1:

const second:number[] = mergeSort(arr.slice(half));

修复后的完整代码

function mergeSort(arr:number[]):number[]{
    if(arr.length <= 1){
        return arr;
    }

    const half:number = Math.floor(arr.length/2);
    const first:number[] = mergeSort(arr.slice(0,half));
    // 修复slice参数,去掉多余的+1
    const second:number[] = mergeSort(arr.slice(half));

    return merge(first, second);
}

function merge(a:number[], b:number[]):number[]{
    const c:number[] = [];
    while(a.length && b.length){
        if(a[0]<b[0]){
            c.push(a.shift()!);
        }else{
            c.push(b.shift()!);
        }
    }

    while(a.length){
        c.push(a.shift()!);
    }

    while(b.length){
        c.push(b.shift()!);
    }

    return c;
}

console.log(mergeSort([4, 53, 22, 10, 2, 74, 91, 33, 25, 14, 19, 100, 256, 81, 7, 300]));

验证结果

修复后运行代码,输出与预期完全一致:

[2, 4, 7, 10, 14, 19, 22, 25, 33, 53, 74, 81, 91, 100, 256, 300]

内容的提问来源于stack exchange,提问作者Bálint Réthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:06:25