一,冒泡排序
冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端。
在冒泡排序中,第
1
轮需要比较
n
-
1
次,第
2
轮需要比较
n
-
2
次……第
n
-
1 轮需 要比较
1
次。因此,总的比较次数为
(
n
-
1
)
+
(
n
-
2
)
+
…
+
1 ≈
n
2
/2
。这个比较次数恒定为 该数值,
和输入数据的排列顺序无关。 不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输 入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;
反过来,输入数据要 是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时 间复杂度为 O
(n2)
。
二,代码实现
添加了泛型
fn bubble_sort<T: PartialOrd + Copy>(list: &mut Vec<T>) -> &Vec<T> {
for i in 0..list.len() {
for x in 0..list.len() - 1 {
//实际交换次数等于 n-1
if list[x] > list[x + 1] {
list.swap(x, x + 1); //元素交换位置
}
}
}
list
}
三,实现效果展示:
fn main() {
let mut list = vec![1, 34, 50, 200, 34, 51, 25, 100, 65];
bubble_sort(&mut list);
println!("{:?} ", list);
let mut list = vec!['D', 'e', 'A', 'C', 'a', 'W'];
bubble_sort(&mut list);
println!("{:?} ", list);
}
console:
[1, 25, 34, 34, 50, 51, 65, 100, 200]
['A', 'C', 'D', 'W', 'a', 'e']