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



我正在尝试用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的数组,你不应该给它重新分配一个新的数组以避免丢失它的引用(避免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);

你可以

  1. 添加一个交换函数,
  2. quicksort_setup而不是直接打电话给quicksort_by_percent_filled
  3. length而不是size
  4. 跳过 get_percent_filled() 的调用,该调用缺失且从未使用返回值,
  5. 在循环中使用arr而不是ar for

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

最新更新