Javascript 在数组的2/3上调用自身的排序算法
我尝试实现一个排序算法,其工作原理如下:给定一个长度为n的数组,该算法应该在数组的前2/3递归调用自己,然后在最后2/3递归调用自己,然后再在数组的前2/3递归调用自己。在每次调用时,算法应该在查看两个或更少的元素时对当前数组进行排序并退出。该方法应采用数组A和两个索引作为参数 所以这里的主要困难是创建表示数组2/3的索引。我的想法是做Javascript 在数组的2/3上调用自身的排序算法,javascript,arrays,algorithm,sorting,Javascript,Arrays,Algorithm,Sorting,我尝试实现一个排序算法,其工作原理如下:给定一个长度为n的数组,该算法应该在数组的前2/3递归调用自己,然后在最后2/3递归调用自己,然后再在数组的前2/3递归调用自己。在每次调用时,算法应该在查看两个或更少的元素时对当前数组进行排序并退出。该方法应采用数组A和两个索引作为参数 所以这里的主要困难是创建表示数组2/3的索引。我的想法是做x=Math.floor((i-j)/3),这样x就是前1/3和后1/3中的元素数。因此,前2/3可以由[i,x*2]限定,最后2/3可以由[x+1,j]限定。你
x=Math.floor((i-j)/3)
,这样x
就是前1/3和后1/3中的元素数。因此,前2/3可以由[i,x*2]
限定,最后2/3可以由[x+1,j]
限定。你认为这个想法有什么错误吗
我提出了下面的算法,但排序不正确。因此,无论是算法还是上述想法都有缺陷。你觉得有什么问题吗
var threeSort = function(A,i,j) {
var diff = j-i;
if (diff <= 2) {
if (A[j] < A[i]) {
var tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
return;
}
var x = Math.floor(diff/3);
threeSort(A,i,x*2);
threeSort(A,x+1,j);
threeSort(A,i,x*2);
};
var arr = [3,4,1,4,2];
threeSort(arr, 0, arr.length-1);
var threeSort=函数(A,i,j){
var-diff=j-i;
如果(diffvar diff=j-i;
如果(diffvar diff=j-i;
如果(diff我不明白你为什么期望这个逻辑对数组进行排序。但很可能你应该总是返回casediff@Oriol correct,我将返回移出了内部if。错误消失了,但算法没有真正排序。我不明白你为什么期望这个逻辑对数组进行排序。但很可能你应该总是这样交回casediff@Oriol correct,我将返回值移出了内部if。错误消失了,但算法没有真正排序。我无法将您的想法应用到。我得到了RangeError:超过了最大调用堆栈大小我不太了解Javascript来控制函数工作流/执行顺序我认为问题不在于执行顺序,而在于about索引计算。你可以尝试使用伪代码。我无法将你的想法应用到。我得到了RangeError:最大调用堆栈大小超过了我不知道Javascript是否足以控制函数工作流/执行顺序我认为问题不在于执行顺序,而在于索引计算。你可以尝试使用伪代码。
var diff = j-i;
if (diff <= 2) {
if (diff < 2) {
if (j-i < 2){
if (A[j] < A[i]) {
var tmp = A[i];
A[i] = A[j];
A[j] = tmp;
};
return;
};
var d = Math.floor((j - i + 1) / 3);
threeSort(A,i,j-d);
threeSort(A,i+d,j);
threeSort(A,i,j-d);