Rust插入排序

Posted 码农一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust插入排序相关的知识,希望对你有一定的参考价值。

排序问题 — 插入排序

排序问题概览

  • 输入: 一个长度为 的序列 , 且
  • 输出: 序列 且满足 .

插入排序简介

算法

插入排序是一个迭代的过程。每次迭代中将一个待排序的元素插入到已排序的序列中的适当位置,形成一个新的已排序数组。

示例

初始时:

  • 序列 A: [5, 2, 4, 6, 1, 3],
  1. 首先, 孤立地看 A[0], 它只是单个元素, 因此是它是已排序的. 之后关注 A[1].
  2. A[1] = 2 小于 A[0] = 5, 因此将 2 移动到 5 之前, 移动后的序列 A 为 [2, 5, 4, 6, 1, 3]. 之后关注 A[2].
  3. A[2] = 4 小于 A[1] = 5, 因此将 4 移动到 5 之前, 移动后的序列 A 为 [2, 4, 5, 6, 1, 3]. 之后关注 A[3].
  4. A[3] = 6 大于等于 A[2] = 5, 因此原地不动, 保持不动的序列 A 为 [2, 4, 5, 6, 1, 3]. 之后关注 A[4].
  5. A[4] = 1 小于 A[3] = 6, 向左观察,A[4] = 1 甚至小于 A[0] = 2, 因此将 1 移动到 2 之前, 移动后的序列 A 为 [1, 2, 4, 5, 6, 3]. 之后关注 A[5].
  6. A[5] = 3 小于 A[2] = 4, 大于 A[1] = 2, 因此将 3 移动到 4 之前, 2 之后, 移动后的序列 A 为 [1, 2, 3, 4, 5, 6]. 完毕。

实现

pub fn insertion_sort(arr: Vec<i32>) -> Vec<i32> {
    let mut arr = arr;
    for i in 1..arr.len() {
        let (mut j, key) = (i, arr[i]);
        while j != 0 && key < arr[j - 1] {
            arr[j] = arr[j - 1];
            j -= 1;
        }
        arr[j] = key;
    }
    return arr;
}

性能

  • 运行时间:
    • 平均运行时间: .
    • 最佳情况: . 输入序列原本就有序。
    • 最坏情况: . 输入序列完全倒序时。
  • 空间复杂度: .

特性

插入排序满足:

  • 对于 较小的数组,其表现更加优秀。
  • 稳定性。对于相同的元素,排序后相对次序保持不变

扩展

  • 按照从大到小的顺序排序:
pub fn insertion_sort(arr: Vec<i32>) -> Vec<i32> {
    let mut arr = arr;
    for i in 1..arr.len() {
        let (mut j, key) = (i, arr[i]);
        while j != 0 && key > arr[j - 1] {
            arr[j] = arr[j - 1];
            j -= 1;
        }
        arr[j] = key;
    }
    return arr;
}

练习

  • 排序数组

参考

  • insertion sort


以上是关于Rust插入排序的主要内容,如果未能解决你的问题,请参考以下文章

Rust插入排序

排序02-直接插入排序法

算法leetcode|35. 搜索插入位置(rust重拳出击)

Rust二叉树插入实现难度

7种基本排序算法的Java实现

rust - 如何在Vec上更新或插入?