插入排序
插入排序
插入排序是一个基于比较的算法,原理在于将排序数组分成排序以及未排序两个部分\
将未排序的部分一点点的插入到已排序的部分中, 直到未排序的部分消失,从而完成数组的排序
算法详情
算法步骤
arr[0..i-1]为已排序数组arr[i]为待排序元素arr[i..arr.len()-1]为待排序数组
我们要做的事情是要将 arr[i] 插入 arr[0..i-1] 中
将arr[0..i-1] 往后挪一个位置, a[j-1] = a[j]
每次挪的时候判断 if a[j-1] > a[i] 如果结果为 true 则继续挪\
若结果为 false 则停止挪动, 设 a[j] = a[i]
算法实现
正常实现
- 伪代码
fn insertion_sort(arr){
let value = arr[i]
let j = i
while j > 0 && arr[j-1] > value {
arr[j] = arr[j-1]
j = j-1
}
arr[j] = value
}
- rust 实现
fn insertion_sorting<T: PartialOrd + Clone>(arr: &mut Vec<T>) {
for i in 1..arr.len() {
let value = arr[i].clone();
let mut j = i;
while (j > 0) && (arr[j - 1] > value) {
arr[j] = arr[j - 1].clone();
j -= 1;
}
arr[j] = value;
}
}
递归实现
- 伪代码
fn recursive_insert_sort(index,arr){
let value = arr[index]
let i = index
while i > 0 && (arr[i-1] > value){
arr[i] = arr[i-1]
i -= 1;
}
arr[i] = value
if index < arr.len()-1{
recursive_insert_sort(index+1,arr)
}
}
- rust 实现
fn recursive_insertion_sorting<T: PartialOrd + Clone>(index: usize, arr: &mut Vec<T>) {
let value = arr[index].clone();
let mut i = index;
while i > 0 && (arr[i - 1] > value) {
arr[i] = arr[i - 1].clone();
i -= 1;
}
arr[i] = value;
if index < arr.len() - 1 {
recursive_insertion_sorting(index + 1, arr);
}
}
算法分析
- 时间复杂度
最佳时间复杂度:当数组是已经排列好的情况下, 算法只需要循环一次, 故最佳时间复杂度为 $O_(n)$
最坏时间复杂度:当数组为倒序的情况下,算法需要做 $n!$ 次操作,故最坏时间复杂度为 $O_(n^2)$

浙公网安备 33010602011771号