我正在尝试用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);
你可以
- 添加一个交换函数,
- 拿
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();