【问题标题】:How to edit the indices of an argument array in JavaScript?如何在 JavaScript 中编辑参数数组的索引?
【发布时间】:2018-08-30 05:18:40
【问题描述】:

我正在尝试用 JavaScript 编写一个快速排序函数。我的代码如下:

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 作为参数传递时,我无法编辑它。我该如何解决这个问题?

【问题讨论】:

  • “但是,每当我运行 test_quicksort 时,都会打印出 [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]。在我看来当数组 arr 作为参数传递时,我无法编辑它。” 不,这不是原因。更改作为参数传递给您的数组的内容没有问题。您的代码中只有某种错误。在调试器中逐句调试(浏览器和 IDE 中内置了一个),查看变量的内容并查看逻辑。
  • 嗯,你永远不会以任何方式改变arr
  • @JonasW.:我认为这就是swap 所做的,但由于代码不在问题中...... :-|

标签: javascript arrays sorting arguments


【解决方案1】:

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

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);

【讨论】:

  • 基本上你是对的,但是完全重写数组似乎有点不理想。可能swap 应该直接做[arr[one], arr[two]] = [arr[two], arr[one]] 但是我们不能确定它不是操作代码的一部分
【解决方案2】:

你可以

  1. 添加交换功能,
  2. quicksort_setup,而不是直接调用quicksort_by_percent_filled
  3. 使用length 而不是size
  4. 跳过对get_percent_filled()的调用,该调用丢失且从不使用返回值,
  5. for 循环中使用arr 而不是ar

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多