选择排序

1. pub fn selection_sort<T: PartialOrd>(arr: &mut [T]) {
2. if arr.len() <= 1 {
3. return;
4. }

6. let size = arr.len();
7. for i in 0..(size - 1) {
8. // 找到最小元素的索引值
9. let mut min_index = i;
10. for j in (i + 1)..size {
11. if arr[j] < arr[min_index] {
12. min_index = j;
13. }
14. }

16. if min_index != i {
17. arr.swap(i, min_index);
18. }
19. }
20. }

22. #[cfg(test)]
23. mod tests {
24. use super::*;

26. #[test]
27. fn test_empty_vec() {
28. let mut empty_vec: Vec<String> = vec![];
29. selection_sort(&mut empty_vec);
30. assert_eq!(empty_vec, Vec::<String>::new());
31. }

33. #[test]
34. fn test_number_vec() {
35. let mut vec = vec![7, 49, 73, 58, 30, 72, 44, 78, 23, 9];
36. selection_sort(&mut vec);
37. assert_eq!(vec, vec![7, 9, 23, 30, 44, 49, 58, 72, 73, 78]);
38. }

40. #[test]
41. fn test_string_vec() {
42. let mut vec = vec![
43. String::from("Bob"),
44. String::from("David"),
45. String::from("Carol"),
46. String::from("Alice"),
47. ];
48. selection_sort(&mut vec);
49. assert_eq!(
50. vec,
51. vec![
52. String::from("Alice"),
53. String::from("Bob"),
54. String::from("Carol"),
55. String::from("David"),
56. ]
57. );
58. }
59. }