Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的合并排序返回重复的元素_Javascript - Fatal编程技术网

javascript中的合并排序返回重复的元素

javascript中的合并排序返回重复的元素,javascript,Javascript,我试图在JS中进行合并排序,但不明白我把事情搞砸了。我希望它返回[1,2,3,4],它返回[1,1,1,4] 哪一部分需要改变 var array = [3,2,1,4] function mergeSort(array) { if (array.length === 1) { return array } else { mid = Math.floor(array.length/2) left = mergeSort(array

我试图在JS中进行合并排序,但不明白我把事情搞砸了。我希望它返回[1,2,3,4],它返回[1,1,1,4]

哪一部分需要改变

var array = [3,2,1,4]

function mergeSort(array) {
    if (array.length === 1) {
        return array
    } else {
        mid = Math.floor(array.length/2)
        left = mergeSort(array.slice(0, mid))
        right = mergeSort(array.slice(mid, array.length))
        return merge(left, right)
    }
}

function merge(left, right) {
    var leftIndex = 0
    var rightIndex = 0
    var sorted = []

    while (leftIndex < left.length && rightIndex < right.length) {
        if (left[leftIndex] <= right[rightIndex]) {
            sorted.push(left[leftIndex])
            leftIndex += 1
        } else {
            sorted.push(right[rightIndex])
            rightIndex += 1
        }
    }

    if (leftIndex < left.length) {
        sorted = sorted.concat(left.slice(leftIndex))
    } else if (rightIndex < right.length) {
        sorted = sorted.concat(right.slice(rightIndex))
    }
    return sorted
}

console.log(mergeSort(array))
var数组=[3,2,1,4]
函数合并排序(数组){
if(array.length==1){
返回数组
}否则{
mid=数学地板(数组长度/2)
左=合并排序(array.slice(0,mid))
右=合并排序(array.slice(mid,array.length))
返回合并(左、右)
}
}
函数合并(左、右){
var leftIndex=0
var rightIndex=0
变量排序=[]
while(leftIndex

var数组=[3,2,1,4],
结果=合并排序(数组);
函数合并排序(数组){
var中、左、右;
if(array.length==1){
返回数组;
}否则{
mid=数学楼层(array.length/2);
左=合并排序(array.slice(0,mid));
右=合并排序(array.slice(mid,array.length));
返回合并(左、右);
}
}
函数合并(左、右){
var leftIndex=0,
rightIndex=0,
排序=[];
while(leftIndex

var数组=[3,2,1,4],
结果=合并排序(数组);
函数合并排序(数组){
var中、左、右;
if(array.length==1){
返回数组;
}否则{
mid=数学楼层(array.length/2);
左=合并排序(array.slice(0,mid));
右=合并排序(array.slice(mid,array.length));
返回合并(左、右);
}
}
函数合并(左、右){
var leftIndex=0,
rightIndex=0,
排序=[];
while(leftIndex如果(left[leftIndex]您有范围问题。您没有声明
left
right
mid
变量,因此它们被视为隐式全局变量并导致混乱

固定的:


您存在范围问题。您没有声明
变量,因此它们被视为隐式全局变量并导致混乱

固定的:


如果它只返回这样一个排序数组
[1,2,3,4]
,为什么你“发明”了这么复杂的函数?如果它只返回这样一个排序数组
[1,2,3,4]
,为什么你“发明”了这么复杂的函数?
function mergeSort(array) {
    if (array.length === 1) {
        return array
    } else {
        var mid = Math.floor(array.length/2)
        var left = mergeSort(array.slice(0, mid))
        var right = mergeSort(array.slice(mid, array.length))
        return merge(left, right)
    }
}