从函数内部调用Javascript函数

时间:2014-04-08 13:51:50

标签: javascript arrays function

function newsort(array) {
    if (array.length <= 1) {
        alert(array);
    } else {
        mid = array.length / 2;
        left = [];
        right = [];
        for (i = 0; i < mid; i++) {
            left.push(array[i]);
        }
        for (i = mid; i <= array.length; i++) {
            right.push(array[i]);
        }
    }
    result = merge(left, right);
    alert(result);
};

function merge(left, right) {
    alert(left);
}

function merge(arr1, arr2) {
    var arr3 = [];
    while (arr1.length > 0 && arr2.length > 0) {
        if (arr1[0] <= arr2[0]) {
            arr3.push(arr1.shift());
        } else {
            arr3.push(arr2.shift());
        }
    }

    while (arr1.length > 0) {
        arr3.push(arr1.shift());
    }

    while (arr2.length > 0) {
        arr3.push(arr2.shift());
    }
    //  time = timeSortingAlgorithm(arr3, newsort(array));
    //  return time;
    return arr3;
};

function makeRandomArray(size) {
    var result = Array();
    while (size > 0) {
        result.push(Math.floor(Math.random() * 100000));
        --size;
    }
    return result;
}

function timeSortingAlgorithm(array, sortingAlgorithm) {
    var startTime = new Date();
    newsort(array);
    var endTime = new Date();
    return endTime.getTime() - startTime.getTime();
}

var array = makeRandomArray(6);
newsort(array);
//timeSortingAlgorithm(array,newsort);

当我运行这段代码时,我的想法是它会将函数merge合并并将数组的两半发送到newsort - 然后将它们合并在一起进行排序。该数组由makeRandomArray函数创建。但是,我无法弄清楚如何合并timeSortingAlgorithm(array,sortingAlgorithm)函数,就像我调用它一样 - 没有任何反应。我现在已经将这些电话注释掉了,但是当我把它们拿出来时 - 根本没有输出。如果我完全退出该功能 - 一切正常。

任何人都能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

三是您实施的主要问题。

  1. 如果您尝试实施合并排序,则必须拆分数组,并且必须在合并之前对拆分部分进行排序。
  2. 除此之外,我能找到的问题是

    1. 您使用的是全局变量,midleftright是全局变量。

    2. 您无法从newsort函数返回已排序的数组。

    3. 您定义了两个合并功能。

    4. 您的mid应该是一个整数,因为您使用它来索引数组,并且会为浮点数返回undefined

    5. 所以,固定的实现看起来像这样

      function newsort(array) {
          if (array.length <= 1) {
              return array;
          } else {
              var mid   = parseInt(array.length / 2), left  = [], right = [];
              for (var i = 0; i < mid; i++) {
                  left.push(array[i]);
              }
              for (i = mid; i < array.length; i++) {
                  right.push(array[i]);
              }
          }
          return merge(newsort(left), newsort(right));
      };
      
      function merge(arr1, arr2) {
          var arr3 = [];
          while (arr1.length > 0 && arr2.length > 0) {
              if (arr1[0] <= arr2[0]) {
                  arr3.push(arr1.shift());
              } else {
                  arr3.push(arr2.shift());
              }
          }
      
          while (arr1.length > 0) {
              arr3.push(arr1.shift());
          }
      
          while (arr2.length > 0) {
              arr3.push(arr2.shift());
          }
          return arr3;
      };
      
      function timeSortingAlgorithm(array, sortingAlgorithm) {
          var startTime = new Date(), result = sortingAlgorithm(array);
          console.log(new Date().getMilliseconds() - startTime.getMilliseconds());
          return result;
      }
      
      var array = makeRandomArray(6);
      console.log(array);
      console.log(timeSortingAlgorithm(array, newsort));
      

答案 1 :(得分:0)

你有一个无限循环。

当你运行这一行时:

time = timeSortingAlgorithm(arr3, newsort(array));

您致电newsort

newsort调用函数merge然后运行,猜猜是什么,这一行:

time = timeSortingAlgorithm(arr3, newsort(array));