我正在尝试为一个i32数组实现快速排序算法。我的问题是,在将数组传递给函数时,使用&mut存在明显的不一致性。我的代码:
fn main() {
let mut my_array = [5, 2, 8, 7];
let high = my_array.len() - 1;
quick_sort(&mut my_array, 0, high);
print!("{:?}", my_array);
}
fn quick_sort(array: &mut [i32], low: usize, high: usize) {
let pivot_idx = partition(array, low, high);
// Separately sort elements before partition and after partition
if pivot_idx > low {
quick_sort(array, low, pivot_idx - 1);
}
if pivot_idx < high {
quick_sort(array, pivot_idx + 1, high);
}
}
fn partition(array: &mut [i32], low: usize, high: usize) -> usize {
let pivot = array[high]; // pivot
let mut i = low;
for j in low..high {
// If current element is less than or equal to pivot
if array[j] <= pivot {
let swapper_variable = array[i];
array[i] = array[j];
array[j] = swapper_variable;
i += 1; // increment index of smaller element
}
}
let swapper_variable = array[i];
array[i] = array[high];
array[high] = swapper_variable;
return i;
}
我的代码工作了,但是它应该吗?在main函数中,我使用
quick_sort(&mut my_array, 0, high)
调用快速排序,但是quick_sort函数内部的递归调用使用quick_sort(array, low, pivot_idx - 1)
而没有使用&mut。此外,在quick_sort中,我还使用
partition(array, low, high)
调用了partition函数,但是partition函数需要一个可变数组作为参数,而我在调用时没有指定&mut。如果我尝试在partition函数调用中添加&mut,则代码将无法编译:
error[E0596]: cannot borrow `array` as mutable, as it is not declared as mutable
--> src/main.rs:9:31
|
8 | fn quick_sort(array: &mut [i32], low: usize, high: usize) {
| ----- help: consider changing this to be mutable: `mut array`
9 | let pivot_idx = partition(&mut array, low, high);
| ^^^^^^^^^^ cannot borrow as mutable
所以似乎存在一些混淆,即数组本身是否可变,还是指向该数组的指针(?)是否可变。但是在我的看来,我应该能够以与从main函数最初调用quick_sort相同的方式调用quick_sort内的函数。据我所知,强制在函数调用中显式放置&mut的目的是这样做可以轻松地看到被调用的函数可能修改参数,但是quick_sort内部的调用没有表明它们会修改数组。代码演示在此:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=62813cd1bd23d8b1a36d6126d4305800
main
函数中,my_array
的类型是[i32; 4]
,然后&mut my_array
是&mut [i32; 4]
,它强制转换为&mut [i32]
。 - mcarton