【入门级-算法-6、排序算法: 插入排序】

一、插入排序算法思想

插入排序(Insertion Sort)的基本思想:

1、将数组分为已排序和未排序两部分;初始时,已排序部分只有一个元素(第一个元素)。

2、依次将未排序部分的元素插入到已排序部分的正确位置。

3、每插入一个元素,已排序部分就增加一个元素,未排序部分就减少一个元素。

4、重复这个过程,直到所有元素都插入到正确的位置。

二、算法步骤(以升序为例)

1、假设有一个数组 arr,长度为 n;从 arr1(第二个元素)开始,作为当前需要插入的元素(key)。

2、将 key 与它前面的元素(已排序部分)从后向前依次比较。如果前面的元素大于 key,则将该元素向后移动一位。继续向前比较,直到找到小于或等于 key 的元素,或者到达数组开头。将 key 插入到找到的位置的后一个位置。

3、重复上述过程,直到所有元素都处理完毕。

三、举例说明

#include <stdio.h>

// 插入排序函数 (升序)

void insertionSort(int arr\[\], int n) {

int i, j, key;

// 从第二个元素开始(下标1),作为要插入的元素

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

key = arri; // 当前需要插入的元素

j = i - 1; // 从当前元素的前一个开始比较

// 将比 key 大的元素都向后移动一位

while (j >= 0 && arrj > key) {

arrj + 1 = arrj;

j = j - 1;

}

// 将 key 插入到正确的位置

arrj + 1 = key;

}

}

// 打印数组的函数

void printArray(int arr\[\], int size) {

int i;

for (i = 0; i < size; i++) {

printf("%d ", arri);

}

printf("\n");

}

// 主函数测试

int main() {

int arr\[\] = {12, 11, 13, 5, 6};

int n = sizeof(arr) / sizeof(arr0); // 计算数组长度

printf("原始数组: \n");

printArray(arr, n);

insertionSort(arr, n); // 调用排序函数

printf("排序后的数组: \n");

printArray(arr, n);

return 0;

}

输出结果如下:

原始数组:

12 11 13 5 6

排序后的数组:

5 6 11 12 13

插入排序是一种简单直观的排序算法,特别适合小规模数据或基本有序的数据。虽然时间复杂度为O(n²),但由于其实现简单、稳定、空间效率高等特点,在实际编程中仍有其用武之地,特别是在作为其他高级算法的组成部分时。

相关推荐
白狐_7981 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2582 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记2 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI2 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型3 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光3 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院4 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡5 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴5 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
江畔柳前堤6 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php