十大排序算法之——插入排序算法

本文详细介绍了插入排序算法的工作原理,通过实例展示了如何实现递增排序,并分析了算法的时间复杂度及稳定性。

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

插入排序,故名思绪,找一个合适的数,插入到相应的位置来达到集合整体有序的目的,具体来说以递增排序为例。取无序集合的首元素,从有序集合的末尾开始找,直到找到一个小于该元素的值结束遍历,将无序集合的元素插入到找到这个元素的后面。

因为不会改变两个相等元素的位置,所以是稳定排序,只需要一个额外的空间,所以控件复杂度为O(1),时间复杂度为O(n^2)。

例如,有集合1,2,7,9,6,3。1,2,7,9部分就是有序的,6,3部分就是无序的,无序集合的首元素就是6,那么问题就是6该插入到什么位置,从有序集合的1,2,7,9末尾9开始找,设6的下标为x,9的下标为y,6<9,那么y--,将9元素向后移一位,空出位置将来放“6”;6<7,y--,7元素后移一位;6>2,此时遍历结束,因为y此时是1,所以放6的位置应该是y+1;然后不断的循环下去。

#include<string>
#include<iostream>
#include<cstring>
#include<head.h>
using namespace std;
//插入排序算法,选出无序集合的第一个元素,从有序集合的末尾开始扫描,直到第一个大于该数,插入到其后面
void insertSort(int *,int);
int main()
{
    int arr[] = {7,1,6,4,5,2,8,10,3,9,11,12};
    int length = sizeof(arr)/sizeof(int);
    cout << "原来的序列:" << endl;
    for(auto var : arr)
    {
        cout << var << " ";
    }
    insertSort(arr,length);

    cout << "\n现在的序列:" << endl;
    for(auto var : arr)
    {
        cout << var << " ";
    }

    return 0;
}

void insertSort(int *arr,int length)
{
    for(int ix=1;ix<length;++ix)
    {
        int curr_elem = arr[ix];    //1     //ix是无序集合,所以需要取无序集合的首元素和有序集合的jy进行对比
        int jy = ix - 1;            //0
        while(jy>=0 && curr_elem < arr[jy])
        {
            arr[jy + 1] = arr[jy];
            jy--;
        }
        arr[jy + 1] = curr_elem;
    }
}

输出:

原来的序列:
7 1 6 4 5 2 8 10 3 9 11 12
现在的序列:
1 2 3 4 5 6 7 8 9 10 11 12

注意1:内存循环jy跳出循环的条件是jy>=0,我不是jy>0,因为还需要和第一个元素进行比较。

注意2:因为元素需要不断向后移,所以无需集合的首元素,一定要copy一份,避免被覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值