Skip to content

Commit 639f513

Browse files
committed
feat: add sorting algorithm in rust
1 parent c75d70e commit 639f513

File tree

14 files changed

+498
-3
lines changed

14 files changed

+498
-3
lines changed
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fn bubble_sort(nums: &mut Vec<i32>) {
2+
let n = nums.len();
3+
for i in 0..n - 1 {
4+
for j in i..n {
5+
if nums[i] > nums[j] {
6+
let temp = nums[i];
7+
nums[i] = nums[j];
8+
nums[j] = temp;
9+
}
10+
}
11+
}
12+
}
13+
14+
fn main() {
15+
let mut nums = vec![1, 2, 7, 9, 5, 8];
16+
bubble_sort(&mut nums);
17+
println!("{:?}", nums);
18+
}

basic/sorting/BubbleSort/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,29 @@ int main(void)
162162
}
163163
```
164164
165+
### **Rust**
166+
167+
```rust
168+
fn bubble_sort(nums: &mut Vec<i32>) {
169+
let n = nums.len();
170+
for i in 0..n - 1 {
171+
for j in i..n {
172+
if nums[i] > nums[j] {
173+
let temp = nums[i];
174+
nums[i] = nums[j];
175+
nums[j] = temp;
176+
}
177+
}
178+
}
179+
}
180+
181+
fn main() {
182+
let mut nums = vec![1, 2, 7, 9, 5, 8];
183+
bubble_sort(&mut nums);
184+
println!("{:?}", nums);
185+
}
186+
```
187+
165188
<!-- tabs:end -->
166189

167190
## 算法分析

basic/sorting/HeapSort/Main.rs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
fn heap_sort(nums: &mut Vec<i32>) {
2+
let n = nums.len();
3+
// 自底向上的下沉
4+
for i in (0..n / 2).rev() {
5+
sink(nums, i, n);
6+
}
7+
for i in (1..n).rev() {
8+
let temp = nums[0];
9+
nums[0] = nums[i];
10+
nums[i] = temp;
11+
sink(nums, 0, i);
12+
}
13+
}
14+
15+
fn sink(nums: &mut Vec<i32>, mut i: usize, n: usize) {
16+
loop {
17+
let left = i * 2 + 1;
18+
let right = left + 1;
19+
let mut largest = i;
20+
if left < n && nums[left] > nums[largest] {
21+
largest = left;
22+
}
23+
if right < n && nums[right] > nums[largest] {
24+
largest = right;
25+
}
26+
if largest == i {
27+
break;
28+
}
29+
let temp = nums[i];
30+
nums[i] = nums[largest];
31+
nums[largest] = temp;
32+
i = largest;
33+
}
34+
}
35+
36+
fn main() {
37+
let mut nums = vec![1, 2, 7, 9, 5, 8];
38+
heap_sort(&mut nums);
39+
println!("{:?}", nums);
40+
}

basic/sorting/HeapSort/README.md

+59
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,63 @@ public class Main {
165165
}
166166
```
167167

168+
### **Rust**
169+
170+
```rust
171+
use std::io;
172+
173+
fn heap_sort(nums: &mut Vec<i32>) {
174+
let n = nums.len();
175+
for i in (0..n / 2).rev() {
176+
sink(nums, i, n);
177+
}
178+
for i in (1..n).rev() {
179+
let temp = nums[0];
180+
nums[0] = nums[i];
181+
nums[i] = temp;
182+
sink(nums, 0, i);
183+
}
184+
}
185+
186+
fn sink(nums: &mut Vec<i32>, mut i: usize, n: usize) {
187+
loop {
188+
let left = i * 2 + 1;
189+
let right = left + 1;
190+
let mut largest = i;
191+
if left < n && nums[left] > nums[largest] {
192+
largest = left;
193+
}
194+
if right < n && nums[right] > nums[largest] {
195+
largest = right;
196+
}
197+
if largest == i {
198+
break;
199+
}
200+
let temp = nums[i];
201+
nums[i] = nums[largest];
202+
nums[largest] = temp;
203+
i = largest;
204+
}
205+
}
206+
207+
fn main() -> io::Result<()> {
208+
let mut s = String::new();
209+
io::stdin().read_line(&mut s)?;
210+
let s: Vec<usize> = s.split(' ').map(|s| s.trim().parse().unwrap()).collect();
211+
// let n = s[0];
212+
let m = s[1];
213+
214+
let mut nums = String::new();
215+
io::stdin().read_line(&mut nums)?;
216+
let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
217+
218+
heap_sort(&mut nums);
219+
for num in nums.iter().take(m) {
220+
print!("{} ", num);
221+
}
222+
223+
Ok(())
224+
}
225+
```
226+
168227
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fn insertion_sort(nums: &mut Vec<i32>) {
2+
let n = nums.len();
3+
for i in 1..n {
4+
let mut j = i - 1;
5+
let temp = nums[i];
6+
while j >= 0 as usize && nums[j] > temp {
7+
nums[j + 1] = nums[j];
8+
j -= 1;
9+
}
10+
nums[j + 1] = temp;
11+
}
12+
}
13+
14+
fn main() {
15+
let mut nums = vec![1, 2, 7, 9, 5, 8];
16+
insertion_sort(&mut nums);
17+
println!("{:?}", nums);
18+
}

basic/sorting/InsertionSort/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,29 @@ int main()
132132
}
133133
```
134134
135+
### **Rust**
136+
137+
```rust
138+
fn insertion_sort(nums: &mut Vec<i32>) {
139+
let n = nums.len();
140+
for i in 1..n {
141+
let mut j = i - 1;
142+
let temp = nums[i];
143+
while j >= 0 as usize && nums[j] > temp {
144+
nums[j + 1] = nums[j];
145+
j -= 1;
146+
}
147+
nums[j + 1] = temp;
148+
}
149+
}
150+
151+
fn main() {
152+
let mut nums = vec![1, 2, 7, 9, 5, 8];
153+
insertion_sort(&mut nums);
154+
println!("{:?}", nums);
155+
}
156+
```
157+
135158
<!-- tabs:end -->
136159

137160
## 算法分析

basic/sorting/MergeSort/Main.rs

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use std::io;
2+
3+
fn merge_sort(nums: &mut Vec<i32>, left: usize, right: usize) {
4+
if left >= right {
5+
return;
6+
}
7+
8+
let mid = left + (right - left) / 2;
9+
merge_sort(nums, left, mid);
10+
merge_sort(nums, mid + 1, right);
11+
12+
let mut temp = Vec::new();
13+
let mut i = left;
14+
let mut j = mid + 1;
15+
16+
while i <= mid && j <= right {
17+
if nums[i] < nums[j] {
18+
temp.push(nums[i]);
19+
i += 1;
20+
} else {
21+
temp.push(nums[j]);
22+
j += 1;
23+
}
24+
}
25+
while i <= mid {
26+
temp.push(nums[i]);
27+
i += 1;
28+
}
29+
while j <= right {
30+
temp.push(nums[j]);
31+
j += 1;
32+
}
33+
34+
for i in left..=right {
35+
nums[i] = temp[i - left];
36+
}
37+
}
38+
39+
fn main() -> io::Result<()> {
40+
let mut n = String::new();
41+
io::stdin().read_line(&mut n)?;
42+
let n = n.trim().parse::<usize>().unwrap();
43+
44+
let mut nums = String::new();
45+
io::stdin().read_line(&mut nums)?;
46+
let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
47+
48+
merge_sort(&mut nums, 0, n - 1);
49+
for num in nums.iter() {
50+
print!("{} ", num);
51+
}
52+
53+
Ok(())
54+
}

basic/sorting/MergeSort/README.md

+59
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,63 @@ int main( void )
351351
}
352352
```
353353
354+
### **Rust**
355+
356+
```rust
357+
use std::io;
358+
359+
fn merge_sort(nums: &mut Vec<i32>, left: usize, right: usize) {
360+
if left >= right {
361+
return;
362+
}
363+
364+
let mid = left + (right - left) / 2;
365+
merge_sort(nums, left, mid);
366+
merge_sort(nums, mid + 1, right);
367+
368+
let mut temp = Vec::new();
369+
let mut i = left;
370+
let mut j = mid + 1;
371+
372+
while i <= mid && j <= right {
373+
if nums[i] < nums[j] {
374+
temp.push(nums[i]);
375+
i += 1;
376+
} else {
377+
temp.push(nums[j]);
378+
j += 1;
379+
}
380+
}
381+
while i <= mid {
382+
temp.push(nums[i]);
383+
i += 1;
384+
}
385+
while j <= right {
386+
temp.push(nums[j]);
387+
j += 1;
388+
}
389+
390+
for i in left..=right {
391+
nums[i] = temp[i - left];
392+
}
393+
}
394+
395+
fn main() -> io::Result<()> {
396+
let mut n = String::new();
397+
io::stdin().read_line(&mut n)?;
398+
let n = n.trim().parse::<usize>().unwrap();
399+
400+
let mut nums = String::new();
401+
io::stdin().read_line(&mut nums)?;
402+
let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
403+
404+
merge_sort(&mut nums, 0, n - 1);
405+
for num in nums.iter() {
406+
print!("{} ", num);
407+
}
408+
409+
Ok(())
410+
}
411+
```
412+
354413
<!-- tabs:end -->

basic/sorting/QuickSort/Main.rs

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use std::io;
2+
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);
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+
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;
26+
}
27+
if largest == i {
28+
break;
29+
}
30+
let temp = nums[i];
31+
nums[i] = nums[largest];
32+
nums[largest] = temp;
33+
i = largest;
34+
}
35+
}
36+
37+
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];
43+
44+
let mut nums = String::new();
45+
io::stdin().read_line(&mut nums)?;
46+
let mut nums: Vec<i32> = nums.split(' ').map(|s| s.trim().parse().unwrap()).collect();
47+
48+
heap_sort(&mut nums);
49+
for num in nums.iter().take(m) {
50+
print!("{} ", num);
51+
}
52+
53+
Ok(())
54+
}

0 commit comments

Comments
 (0)