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

一、插入排序算法思想

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

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

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

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

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

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

1、假设有一个数组 arr,长度为 n;从 arr[1](第二个元素)开始,作为当前需要插入的元素(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 = arr[i]; // 当前需要插入的元素

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

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

while (j >= 0 && arr[j] > key) {

arr[j + 1] = arr[j];

j = j - 1;

}

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

arr[j + 1] = key;

}

}

// 打印数组的函数

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

int i;

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

printf("%d ", arr[i]);

}

printf("\n");

}

// 主函数测试

int main() {

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

int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度

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²),但由于其实现简单、稳定、空间效率高等特点,在实际编程中仍有其用武之地,特别是在作为其他高级算法的组成部分时。

相关推荐
bIo7lyA8v几秒前
算法稳定性分析中的数值误差传播机制的技术5
算法
生信研究猿5 分钟前
leetcode 121.买卖股票的最佳时机
算法·leetcode·职场和发展
CoovallyAIHub6 分钟前
不需要Memory Bank:CMDR-IAD用2D+3D双分支重建做工业异常检测,MVTec 3D 97.3%
算法·架构·github
AI科技星17 分钟前
基于四维速率恒为c公设的北斗GEO卫星昼夜钟差模型修正与实测验证
开发语言·人工智能·线性代数·算法·数学建模
sheeta199823 分钟前
LeetCode 每日一题笔记 日期:2026.04.09 题目:3655.区间乘法查询后的异或二
笔记·算法·leetcode
何伯特27 分钟前
STTR算法详解:用Transformer重新定义立体匹配
深度学习·算法·transformer
深邃-28 分钟前
【C语言】-数据在内存中的存储(2):浮点数在内存中的存储
c语言·开发语言·数据结构·c++·算法·html5
大黄说说30 分钟前
深入.NET内存模型:垃圾回收(GC)机制与性能优化指南
java·jvm·算法
满满和米兜33 分钟前
【Java基础】- 集合 - ArrayList与LinkedList
java·python·算法
aqiu11111134 分钟前
【算法日记 09】蓝桥杯实战:突破整数极限,拥抱“字符串思维”
算法·职场和发展·蓝桥杯