一,插入排序
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。
插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
在插入排序中,需要将取出的数据与其左边的数字进行比较。就跟前面讲的步骤一 样,如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换 数字的位置。
然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换 数字,直到它到达整个序列的最左边为止。具体来说,就是第 k
轮需要比较
k
-
1
次。
因 此,在最糟糕的情况下,输入数据按从大到小的顺序排列时,第 2 轮需要操作
1
次,第
3
轮操作
2
次……第
n
轮操作
n
-
1 次,所以时间复杂度和冒泡排序的一样,都为 O(
n2
)。
二,代码实现
///插入排序
///插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。
///插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
fn insert_sort<T: PartialOrd + Copy>(list: &mut Vec<T>) -> &Vec<T> {
let mut chang_index = 0;
let mut element = list[chang_index];
for i in 0..list.len() {
if let Some(elem) = list.get(i) {
if element > *elem {
list.swap(i, chang_index); //交换归位
chang_index = i;
//检查已归位的数据
bubble_sort_len(list, chang_index);
} else {
element = *elem; //切换边界
chang_index = i;
}
}
}
list
}
///选择长度,冒泡
fn bubble_sort_len<T: PartialOrd + Copy>(list: &mut Vec<T>, len: usize) -> &Vec<T> {
for i in 0..len {
for x in 0..len - 1 {
if list[x] > list[x + 1] {
list.swap(x, x + 1);
}
}
}
list
}
三,效果展示
fn main {
let mut list = vec![5, 3, 4, 7, 2, 8];
insert_sort(&mut list);
println!("{:?} ", list);
}
console:
[2, 3, 4, 5, 7, 8]
四,过程演变
外层循环 [3, 5, 4, 7, 2, 8]
外层循环 [3, 4, 5, 7, 2, 8]
外层循环 [3, 4, 5, 2, 7, 8]
内层循环 [3, 4, 2, 5, 7, 8]
内层循环 [3, 2, 4, 5, 7, 8]
内层循环 [2, 3, 4, 5, 7, 8]