Skip to content

Commit 155304c

Browse files
committed
temp: save file
1 parent 130779b commit 155304c

File tree

5 files changed

+120
-20
lines changed

5 files changed

+120
-20
lines changed

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
> 本项目还在施工中...
44
5-
所有排序使用的数据为(0, 10000)的`i32`类型数字.
5+
所有排序使用的数据为(0, 10000)的`i32`类型数字.如果你对于下面某些排序有疑问,可以去[www.cs.usfca.edu](https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html)以动画形式查看各种排序,非常简单易懂.
66

7-
## 冒泡
7+
## 冒泡排序
88

99
实现了三种冒泡方式,每次都以上一次进行优化:
1010

@@ -18,4 +18,10 @@ bubble1 take time PT6.687554709S
1818
bubble2 take time PT6.535498605S
1919
```
2020

21-
可见优化后差距并不大,总体都在6.5秒之间.但是数据量提升一个数量级后时间会增加很多,比如(0,100000)的数据量使用冒泡是非常久的.
21+
可见优化后差距并不大,总体都在6.5秒之间.但是数据量提升一个数量级后时间会增加很多,比如(0,100000)的数据量使用冒泡是非常久的.
22+
23+
## 选择排序
24+
25+
```
26+
select take time PT4.073199300S
27+
```

src/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rand::Rng;
22

33
pub fn init() -> Vec<i32> {
4-
let n = 10000;
4+
let n = 10;
55
let mut array = Vec::new();
66

77
let mut rng = rand::thread_rng();

src/bubble.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
use time::PreciseTime;
22

3+
fn swap(val: &mut Vec<i32>, a: usize, b: usize) {
4+
val[a] = val[a] ^ val[b];
5+
val[b] = val[a] ^ val[b];
6+
val[a] = val[a] ^ val[b];
7+
}
8+
39
// 冒泡
410
fn bubble(val: &Vec<i32>) -> Vec<i32> {
511
let mut value = val.clone();
612
for i in 0..value.len() {
713
for m in 0..value.len() - 1 - i {
814
if value[m] > value[m + 1] {
9-
let temp = value[m];
10-
value[m] = value[m + 1];
11-
value[m + 1] = temp;
15+
swap(&mut value, m, m + 1);
1216
}
1317
}
1418
}
@@ -22,9 +26,7 @@ fn bubble1(val: &Vec<i32>) -> Vec<i32> {
2226
let mut flag = 0;
2327
for m in 0..value.len() - 1 - i {
2428
if value[m] > value[m + 1] {
25-
let temp = value[m];
26-
value[m] = value[m + 1];
27-
value[m + 1] = temp;
29+
swap(&mut value, m, m + 1);
2830
flag = 1;
2931
}
3032
}
@@ -43,9 +45,7 @@ fn bubble2(val: &Vec<i32>) -> Vec<i32> {
4345
let mut flag = 0;
4446
for m in 0..last_change {
4547
if value[m] > value[m + 1] {
46-
let temp = value[m];
47-
value[m] = value[m + 1];
48-
value[m + 1] = temp;
48+
swap(&mut value, m, m + 1);
4949
flag = 1;
5050
last_change = m + 1;
5151
}

src/main.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1+
use std::env;
2+
13
extern crate time;
24
extern crate rand;
35

46
mod array;
57
mod bubble;
6-
7-
// 选择
8-
//fn select(val: &Vec<i32>) -> Vec<i32> {
9-
//
10-
//}
8+
mod select;
119

1210
fn main() {
13-
let array_value: Vec<i32> = array::init();
11+
if let Some(name) = env::args().nth(1) {
12+
// let array_value: Vec<i32> = array::init();
13+
let array_value = vec![0, 5, 4, 1, 8, 0, 7, 0, 2, 3];
1414

15-
bubble::test(&array_value);
15+
match name.as_ref() {
16+
"bubble" => bubble::test(&array_value),
17+
"select" => select::test(&array_value),
18+
_ => println!("please input sort name")
19+
}
20+
}
1621
}
1722

1823

src/select.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
use time::PreciseTime;
2+
3+
fn swap(val: &mut Vec<i32>, a: usize, b: usize) {
4+
val[a] = val[a] ^ val[b];
5+
val[b] = val[a] ^ val[b];
6+
val[a] = val[a] ^ val[b];
7+
}
8+
9+
// 选择
10+
fn select(val: &Vec<i32>) -> Vec<i32> {
11+
let mut value = val.clone();
12+
for i in 0..value.len() - 1 {
13+
let mut min = i;
14+
for n in i+1..value.len() {
15+
if value[n] < value[min] {
16+
min = n;
17+
}
18+
}
19+
if min != i {
20+
swap(&mut value, min, i);
21+
}
22+
}
23+
value
24+
}
25+
26+
// 优化1
27+
fn select1(val: &Vec<i32>) -> Vec<i32> {
28+
let mut value = val.clone();
29+
let mut left = 0;
30+
let mut right = value.len() - 1;
31+
32+
while left < right {
33+
let mut min = left;
34+
let mut max = right;
35+
36+
for n in left..right+1 { // 需要循环到right下标,因此需要加1
37+
if value[min] > value[n] {
38+
min = n;
39+
}
40+
if value[max] < value[n] {
41+
max = n;
42+
}
43+
}
44+
println!("min: {}, max: {}, left: {}, right: {}", min, max, left, right);
45+
println!("min value: {}, max value: {}", value[min], value[max]);
46+
47+
if min == right && max == left {
48+
swap(&mut value, left, right);
49+
} else {
50+
if min != left {
51+
// if min == right {
52+
// right =
53+
// }
54+
swap(&mut value, min, left);
55+
}
56+
if max != right {
57+
swap(&mut value, if max == left { min } else { max }, right);
58+
}
59+
}
60+
// if value[min] < value[left] && min != left {
61+
// swap(&mut value, min, left);
62+
// }
63+
// if value[max] > value[right] && max != right {
64+
// swap(&mut value, max, right);
65+
// }
66+
println!("{:?}", value);
67+
left+=1;
68+
right-=1;
69+
}
70+
value
71+
}
72+
73+
pub fn test(array_value: &Vec<i32>) {
74+
println!("Start test select sort:{:?}", array_value);
75+
76+
let start_select = PreciseTime::now();
77+
let a = select(&array_value);
78+
let end_select = PreciseTime::now();
79+
println!("select take time {}", start_select.to(end_select));
80+
81+
let start_select = PreciseTime::now();
82+
let b = select1(&array_value);
83+
let end_select = PreciseTime::now();
84+
println!("select1 take time {}", start_select.to(end_select));
85+
86+
println!("{:?}", a);
87+
println!("{:?}", b);
88+
println!("{}", a == b);
89+
}

0 commit comments

Comments
 (0)