基础算法之插入排序

物理
基础算法之插入排序

用户头像
Silicon(硅)『对酒当歌』 更新于2025-8-25 10:50:33

插入排序


〇、返回

Screenshot_2025-08-24-15-06-40-455.jpg


一、概述

插入排序是一种简单直观的比较类排序算法。它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序适用于少量数据的排序,时间复杂度为O($n^2$),是稳定的排序方法。


二、工作原理

插入排序的基本思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,直到整个数据变成有序序列。


三、算法步骤

1. 初始化:假设数组的第一个元素是一个已排序的子数组。

2. 遍历数组:从第二个元素开始,将其与已排序的子数组进行比较。

3. 比较和插入:

    将当前元素与已排序子数组中的元素从后向前逐一比较。

    如果当前元素小于已排序子数组中的某个元素,则将该元素向后移动一位。

    重复上述步骤,直到找到合适的位置插入当前元素。

4. 重复步骤2-3:对数组中的每个元素重复上述步骤,直到整个数组排序完成。


四、代码示例(C++)

#include<bits/stdc++.h>

using namespace std;

int main() {

    int n;

    cin>>n;

    vector<int> a(n);

    for (int i=0;i<n;i++) {

        cin>>a[i];

    }

    for (int i=1;i<n;i++) {

        int key=a[i];

        int j=i-1;

        // 在已排序的部分中找到插入位置

        while (j>=0 and a[j]>key) {

            a[j+1]=a[j];        // 向后移动元素

            j--;

        }

        a[j+1]=key;        // 插入元素

    }

    for (int i=0;i<n;i++) {

        cout<<a[i]<<" ";

    }

    cout<<"\n";

    return 0;

}


时空复杂度及稳定性

时间复杂度

最好情况:O(n)(当输入数组已经是排序好的)

最坏情况:O($n^2$)(当输入数组是逆序的)

平均情况:O($n^2$)

空间复杂度

O(1)(原地排序)

稳定性

插入排序是稳定的排序算法,即相等的元素的相对顺序在排序后不会改变。


总结

插入排序是一种简单且直观的排序算法,特别适用于小规模数据或部分有序的数据。它的实现简单,易于理解,但在大规模数据排序时效率较低。插入排序的一个重要特性是其稳定性,这在某些应用场景中非常重要。尽管插入排序的时间复杂度在最坏情况下为O($n^2$),但在实际应用中,对于小规模数据或接近有序的数据,插入排序仍然表现出良好的性能。

收起
2
1
共2条回复
时间正序
用户头像
Silicon(硅)『对酒当歌』
1天前
答疑楼
bobble