Skip to content

Commit 0a70653

Browse files
authored
fix: modify mismatched source code in sorting algorithm
1 parent a9afd4b commit 0a70653

File tree

1 file changed

+28
-34
lines changed

1 file changed

+28
-34
lines changed

basic/sorting/QuickSort/Main.rs

+28-34
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,46 @@
1+
use rand::Rng; // 0.7.2
12
use std::io;
23

3-
fn heap_sort(nums: &mut Vec<i32>) {
4-
let n = nums.len();
5-
for i in (0..n / 2).rev() {
6-
sink(nums, i, n);
4+
fn quick_sort(nums: &mut Vec<i32>, left: usize, right: usize) {
5+
if left >= right {
6+
return;
77
}
8-
for i in (1..n).rev() {
9-
let temp = nums[0];
10-
nums[0] = nums[i];
11-
nums[i] = temp;
12-
sink(nums, 0, i);
13-
}
14-
}
158

16-
fn sink(nums: &mut Vec<i32>, mut i: usize, n: usize) {
17-
loop {
18-
let left = i * 2 + 1;
19-
let right = left + 1;
20-
let mut largest = i;
21-
if left < n && nums[left] > nums[largest] {
22-
largest = left;
23-
}
24-
if right < n && nums[right] > nums[largest] {
25-
largest = right;
9+
let random_index = rand::thread_rng().gen_range(left, right + 1);
10+
let temp = nums[random_index];
11+
nums[random_index] = nums[left];
12+
nums[left] = temp;
13+
14+
let pivot = nums[left];
15+
let mut i = left;
16+
let mut j = right;
17+
while i < j {
18+
while i < j && nums[j] >= pivot {
19+
j -= 1;
2620
}
27-
if largest == i {
28-
break;
21+
nums[i] = nums[j];
22+
while i < j && nums[i] < pivot {
23+
i += 1;
2924
}
30-
let temp = nums[i];
31-
nums[i] = nums[largest];
32-
nums[largest] = temp;
33-
i = largest;
25+
nums[j] = nums[i];
3426
}
27+
nums[i] = pivot;
28+
29+
quick_sort(nums, left, i);
30+
quick_sort(nums, i + 1, right);
3531
}
3632

3733
fn main() -> io::Result<()> {
38-
let mut s = String::new();
39-
io::stdin().read_line(&mut s)?;
40-
let s: Vec<usize> = s.split(' ').map(|s| s.trim().parse().unwrap()).collect();
41-
// let n = s[0];
42-
let m = s[1];
34+
let mut n = String::new();
35+
io::stdin().read_line(&mut n)?;
36+
let n = n.trim().parse::<usize>().unwrap();
4337

4438
let mut nums = String::new();
4539
io::stdin().read_line(&mut nums)?;
4640
let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
4741

48-
heap_sort(&mut nums);
49-
for num in nums.iter().take(m) {
42+
quick_sort(&mut nums, 0, n - 1);
43+
for num in nums.iter() {
5044
print!("{} ", num);
5145
}
5246

0 commit comments

Comments
 (0)