我正在尝试用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
。我该如何解决这个问题?
答案 0 :(得分: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);
&#13;
答案 1 :(得分:0)
你可以
quicksort_setup
而非直接致电quicksort_by_percent_filled
,length
代替size
,get_percent_filled()
的调用,该调用缺失且返回值从未使用过,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();