【排序】详解插入排序

一、思想

插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具体步骤如下,将数组下标为0的元素视为已经排序的部分,从1开始遍历数组,在遍历的过程中当前元素从当前位置开始在已经排序的部分中寻找到合适的位置并插入,直到遍历完整个数组。

二、图解

图解

初识时遍历指针指向下标为1的元素

此时在已排序部分0 , i - 1开始寻找合适的位置进行插入,先将i位置的值进行记录,然后开始定义指针在已排序区间寻找

在j从i-1遍历向0的过程中,拿arrj与存储的变量t进行比较,因为前部分都是已排序部分,所有在进行比较时会出现两种情况:1》arrj > t 说明此时j位置并不是t要插入的位置,这个时候我们可以让j+1的位置修改为arrj,然后j--继续去比较 2》arrj < =t, 此时说明j位置就是t要插入的位置,我们可以结束j的遍历然后让j + 1位置的值更改为t

此时i指针继续向后遍历,j依旧指向i-1向0遍历寻找arri也就是t要插入的位置

i再往后遍历,重复上述过程

这个时候arrj > t,于是让arrj+1=arrj

依旧是arrj > t,于是让arrj+1=arrj

接着i++,继续重复这个过程

说明:上述寻找t的插入位置的过程我们也可以通过二分在已排序的区间中寻找到t该插入的位置,在寻找到t要插入的位置后,在插入t之前,我们要先将t要插入的位置到i-1的区间所有的值都后移一位

三、代码实现

C++

cpp 复制代码
void insert_sort(vector<int>& arr) {
    for (int i = 1; i < arr.size(); i++) {
        int j = i - 1, t = arr[i];
        for (j = i - 1; j >= 0; j--) {
            if (arr[j] > t) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j + 1] = t;
    }
}

Java

java 复制代码
    public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i - 1, t = arr[i];
            for (j = i - 1; j >= 0; j--) {
                if (arr[j] > t) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            arr[j  + 1] = t;
        }
    }
相关推荐
无忧.芙桃1 分钟前
数据结构之顺序表的实现
数据结构
罗超驿4 分钟前
11.LeetCode 1004. 最大连续1的个数 III | 滑动窗口解法详解(Java)
java·算法·leetcode
我叫张小白。8 分钟前
Redis的缓存雪崩、击穿、穿透和解决方案
数据结构·redis·fastapi·缓存穿透·缓存击穿·雪崩·热点key问题
QiLinkOS9 分钟前
发明人与专利价值共生逻辑
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
计算机安禾20 分钟前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
磊 子21 分钟前
STL之set以及set和map区别
开发语言·c++·算法
Promise微笑31 分钟前
算法突围:“双核四驱”理论下的“官网”AI引用概率提升指南
人工智能·算法·chatgpt
KaMeidebaby37 分钟前
卡梅德生物技术快报|免疫共沉淀 - Co-IP 实验在转录因子 ATF3/Smad4 蛋白互作研究中的应用实例解析
网络·人工智能·网络协议·tcp/ip·其他·算法·新浪微博
wayz1142 分钟前
20260530 软件ETF(159852)量化分析
算法·金融·数据分析·量化交易
通信小呆呆1 小时前
Hankel结构及其快速算法详解
线性代数·算法·机器学习