插入排序

插入排序

插入排序是一个基于比较的算法,原理在于将排序数组分成排序以及未排序两个部分\
将未排序的部分一点点的插入到已排序的部分中, 直到未排序的部分消失,从而完成数组的排序

算法详情

算法步骤

  1. arr[0..i-1] 为已排序数组
  2. arr[i] 为待排序元素
  3. 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)$

posted @ 2025-07-04 15:59  五花肉炒河粉  阅读(13)  评论(0)    收藏  举报