Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 639f513

Browse files
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
Lines changed: 18 additions & 0 deletions
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‎

Lines changed: 23 additions & 0 deletions
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‎

Lines changed: 40 additions & 0 deletions
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‎

Lines changed: 59 additions & 0 deletions
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 -->
Lines changed: 18 additions & 0 deletions
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‎

Lines changed: 23 additions & 0 deletions
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‎

Lines changed: 54 additions & 0 deletions
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‎

Lines changed: 59 additions & 0 deletions
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‎

Lines changed: 54 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /