如何在JavaScript中编辑参数数组的索引?

时间:2018-03-21 07:19:29

标签: javascript arrays sorting arguments

我正在尝试用JavaScript编写quicksort函数。我的代码如下:

function test_quicksort(){
  var arr = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1];
  arr = quicksort_by_percent_filled(arr);
  Logger.log(arr);
}


function quicksort_setup(arr){
  var high = arr.size - 1;
  arr = quicksort_by_percent_filled(arr, 0, high);
  return arr
}


function quicksort_by_percent_filled(arr, low, high){
  if (low < high){
    var pi = partition(arr, low, high);
    quicksort_by_percent_filled(arr, low, pi - 1);
    quicksort_by_percent_filled(arr, pi + 1, high);
  }
  return arr;
}


function partition(arr, low, high){
    var pivot = arr[high];
    var smaller_boundary = low - 1;
    var curr_elem = low;
    for (; curr_elem <= high; curr_elem++){
      if (ar[curr_elem] < pivot){
            smaller_boundary++;
            swap(arr, curr_elem, smaller_boundary);
      }
    }
    swap(arr, high, smaller_boundary + 1);
    return smaller_boundary + 1;
}


function swap(arr, a, b){
  var temp = arr[a];
  arr[a] = arr[b];
  arr[b] = temp;
  Logger.log(arr);
}

假设Logger.log(arr)是一个打印出数组内容的函数,它应该打印出正确排序的数组。但是,每当我运行test_quicksort时,都会打印[0, 9, 8, 7, 6, 5, 4, 3, 2, 1]。在我看来,当它作为参数传递时,我无法编辑数组arr。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果你想改变传递给test_quicksort的数组,你就不能为它重新分配一个新数组,以免丢失它的引用(避免arr = newArr;)。您可以使用arr.prototype.splice清空数组,而不是重新分配,然后将已排序数组的所有元素推入其中:

&#13;
&#13;
function test_quicksort(arr){
    var newArr = quicksort_by_percent_filled(arr);
    arr.splice(0, arr.length);
    arr.push(...newArr);	
}


function quicksort_by_percent_filled() {
  return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
}

var arr = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1];
test_quicksort(arr);
console.log(arr);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你可以

  1. 添加交换功能,
  2. quicksort_setup而非直接致电quicksort_by_percent_filled
  3. length代替size
  4. 跳过get_percent_filled()的调用,该调用缺失且返回值从未使用过,
  5. arr循环中使用ar代替for
  6. function swap(array, i, j) { // 1
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    
    function test_quicksort() {
        var arr = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1];
        arr = quicksort_setup(arr); // 2
        console.log(arr);
    }
    
    function quicksort_setup(arr) {
        var high = arr.length - 1; // 3
        var percent_filled; // = get_percent_filled(); // 4
        arr = quicksort_by_percent_filled(arr, 0, high, percent_filled);
        return arr
    }
    
    function quicksort_by_percent_filled(arr, low, high, percent_filled) {
        if (low < high) {
            var pi = partition(arr, low, high, percent_filled);
            quicksort_by_percent_filled(arr, low, pi - 1, percent_filled);
            quicksort_by_percent_filled(arr, pi + 1, high, percent_filled);
        }
        return arr;
    }
    
    function partition(arr, low, high, percent_filled) {
        var pivot = arr[high];
        var smaller_boundary = low - 1;
        var curr_elem = low;
        for (; curr_elem <= high; curr_elem++) {
            if (arr[curr_elem] < pivot) { // 5
            //if (percent_filled[arr[curr_elem]] < percent_filled[pivot]){
                smaller_boundary++;
                swap(arr, curr_elem, smaller_boundary);
            }
        }
        swap(arr, high, smaller_boundary + 1);
       return smaller_boundary + 1;
    }
    
    test_quicksort();

相关问题