|
| 1 | +use rand::Rng; // 0.7.2 |
1 | 2 | use std::io;
|
2 | 3 |
|
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; |
7 | 7 | }
|
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 |
| -} |
15 | 8 |
|
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; |
26 | 20 | }
|
27 |
| - if largest == i { |
28 |
| - break; |
| 21 | + nums[i] = nums[j]; |
| 22 | + while i < j && nums[i] < pivot { |
| 23 | + i += 1; |
29 | 24 | }
|
30 |
| - let temp = nums[i]; |
31 |
| - nums[i] = nums[largest]; |
32 |
| - nums[largest] = temp; |
33 |
| - i = largest; |
| 25 | + nums[j] = nums[i]; |
34 | 26 | }
|
| 27 | + nums[i] = pivot; |
| 28 | + |
| 29 | + quick_sort(nums, left, i); |
| 30 | + quick_sort(nums, i + 1, right); |
35 | 31 | }
|
36 | 32 |
|
37 | 33 | 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(); |
43 | 37 |
|
44 | 38 | let mut nums = String::new();
|
45 | 39 | io::stdin().read_line(&mut nums)?;
|
46 | 40 | let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
|
47 | 41 |
|
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() { |
50 | 44 | print!("{} ", num);
|
51 | 45 | }
|
52 | 46 |
|
|
0 commit comments