Javascript中合并排序的迭代方法
我试图用javascript迭代实现合并排序。我也尝试过在互联网上搜索,但他们只有C、Python和java语言。函数提供的数组未排序。我尝试了不同的方法,但没有找出错误。有人能指出我做错了什么吗Javascript中合并排序的迭代方法,javascript,arrays,sorting,mergesort,Javascript,Arrays,Sorting,Mergesort,我试图用javascript迭代实现合并排序。我也尝试过在互联网上搜索,但他们只有C、Python和java语言。函数提供的数组未排序。我尝试了不同的方法,但没有找出错误。有人能指出我做错了什么吗 function mergeSortIterative(arr){ let sorted=[...arr];//copying the array so that original remains unchanged. let n=sorted.length; let curr
function mergeSortIterative(arr){
let sorted=[...arr];//copying the array so that original remains unchanged.
let n=sorted.length;
let currSize;
let leftStart;
for(currSize=1;currSize<=n-1;currSize=2*currSize){
for(leftStart=0;leftStart<n-1;leftStart+=2*currSize){
let mid=Math.min(leftStart+currSize-1,n-1);
let rightEnd=Math.min(leftStart+2*currSize-1,n-1);
// let left=sorted.slice(leftStart,mid);
// let right=sorted.slice(mid,rightEnd);
// sorted=mergeIterative(sorted,left,right);
mergeIterative(sorted,leftStart,mid,rightEnd);
}
}
return sorted;
}
function mergeIterative(sorted,leftStart,mid,rightEnd){
let left=sorted.slice(leftStart,mid);
let right=sorted.slice(mid,rightEnd);
let leftIndex=0,rightIndex=0,k=leftStart;
while(leftIndex<left.length && rightIndex<right.length){
//picking the lesser one
if(left[leftIndex]<=right[rightIndex]){
sorted[k]=left[leftIndex];
leftIndex++;
k++;
}
else{
sorted[k]=right[rightIndex];
rightIndex++;
k++;
}
}
while(leftIndex<left.length && k<sorted.length){
sorted[k]=left[leftIndex];
leftIndex++;
k++;
}
while(rightIndex<right.length && k<sorted.length){
sorted[k]=right[rightIndex];
rightIndex++;
k++;
}
}
函数合并排序(arr){
让sorted=[…arr];//复制数组,使原始数组保持不变。
设n=sorted.length;
让我们看看大小;
让我们开始吧;
对于(currSize=1;currSizePranav):我在下面引用了一个迭代合并排序算法,该算法是针对之前提出的类似问题提供的:
函数合并排序(arr){
var sorted=arr.slice(),
n=已排序的长度,
缓冲区=新阵列(n);
对于(变量大小=1;大小 如果(排序[左]代码中的错误在mid
和rightEnd
含义的定义中不一致
从下面的代码中,我们了解到这些索引指向前面子数组后面的条目:
let left = sorted.slice(leftStart, mid);
let right = sorted.slice(mid, rightEnd);
但在看作业时:
let mid = Math.min(leftStart + currSize - 1, n - 1);
let rightEnd = Math.min(leftStart + 2 * currSize - 1, n - 1);
…我们看到它们指向前面子数组的最后一个元素
您可以通过两种方式更正此问题,但由于slice
解释其参数的方式是“标准”方式,因此我建议在赋值中进行更正,删除所有-1
,如下所示:
let mid = Math.min(leftStart + currSize, n);
let rightEnd = Math.min(leftStart + 2 * currSize, n);
那么你是说js中的合并排序在web上不存在?不。我指的是迭代方法,它不是不存在的,它很难找到。我看到了它在Java中的实现,它们有-1。你能解释一下吗?就像我写的,有两种方法来纠正它。可能Java版本有切片的实现方式是在切片中包含结尾索引。因此,它对mid
和rightEnd
使用了不同的语义。是的,谢谢。我以前见过。但是,它们只是在函数中实现的,所以我想在我的代码中发现问题后再看一看。