Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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 在数组的2/3上调用自身的排序算法_Javascript_Arrays_Algorithm_Sorting - Fatal编程技术网

Javascript 在数组的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]限定。你

我尝试实现一个排序算法,其工作原理如下:给定一个长度为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]
限定。你认为这个想法有什么错误吗

我提出了下面的算法,但排序不正确。因此,无论是算法还是上述想法都有缺陷。你觉得有什么问题吗

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;
如果(diff
var diff=j-i;
如果(diff
var diff=j-i;

如果(diff我不明白你为什么期望这个逻辑对数组进行排序。但很可能你应该总是返回case
diff@Oriol correct,我将返回移出了内部if。错误消失了,但算法没有真正排序。我不明白你为什么期望这个逻辑对数组进行排序。但很可能你应该总是这样交回case
diff@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);