[排序算法]插入排序

这篇博客详细介绍了插入排序的基本思想,通过将待排序元素逐个插入已排序序列来构建有序数组。讨论了最好情况(已升序排列)和最坏情况(已降序排列)下的比较次数,指出其平均时间复杂度为O(n^2)。虽然不适合大规模数据,但对于小规模数据排序,插入排序表现优于冒泡排序和选择排序。此外,由于插入排序的稳定性,相等元素的相对顺序得以保持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。

从数组的第二个元素开始,将数组中的每一个元素按照(升序或者降序)规则插入到已排好序的数组中以达到排序的目的.
一般情况下将数组的第一个元素作为起始元素,从第二个元素开始依次插入。由于要插入到的数组是已经排好序的,所以只要从右向左(或者从后向前)找到排序插入点插入元素,以此类推,直到将最后一个数组元素插入到数组中,整个排序过程完成。

插入排序的思路跟整理扑克牌是一样的,即每次拿到一张牌,按大小顺序将其插入到合适的位置。那么插入排序实际上就是:每次将一个数插入到有序的数组中去(初始一个数字自然有序)。

#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
void InsertSort(int* b,int len)
{
    for (int i=1;i<len;i++)
    {
        for(int j = i;j > 0;j--)
        {
            if(b[j] < b[j - 1])//后一个数 < 前一个数,要互换位置
            {
                int temp = b[j];
                b[j] = b[j -1];
                b[j -1] = temp;
            }
        }
    }
}
int main()
{
    int a[10];
    srand(time(NULL));
    for (int i=0;i<10;i++)
    {
        a[i]=rand()%499+1;
    }
    cout<<"before sort numbers: ";
    for (int i=0;i<10;i++)
    {
        cout<<" "<<a[i];
    }
    cout<<endl;
    InsertSort(a,10);
    cout<<" after sort numbers: ";
    for (int i=0;i<10;i++)
    {
        cout<<" "<<a[i];
    }
    cout<<endl;
    return 0;
}

算法复杂度


如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 尽管插入排序的时间复杂度也是O(n2),但一般情况下,插入排序会比冒泡排序快一倍,要比选择排序还要快一点。
稳定性
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。
当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

插入排序|选择排序|交换排序|归并排序|基数排序 动画

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值