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

相关推荐
勤劳的进取家2 小时前
数据链路层基础
网络·学习·算法
Advancer-3 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
ん贤3 小时前
加密算法(对称、非对称、哈希、签名...)
算法·哈希算法
superior tigre4 小时前
78 子集
算法·leetcode·深度优先·回溯
天威?*4 小时前
bitset的数据结构用法
算法·动态规划
hoiii1874 小时前
粒子滤波跟踪系统 - 蒙特卡洛方法实现
算法
weisian1515 小时前
Java并发编程--47-分布式ID生成器:雪花算法(Snowflake)与时钟回拨问题
java·算法·时钟回拨·雪花算法id
itzixiao5 小时前
L1-066 猫是液体(5分)[java][python]
java·开发语言·python·算法
ytttr8735 小时前
MATLAB SIFT图像配准实现
算法·机器学习·matlab
小饕5 小时前
从 Word2Vec 到多模态:词嵌入技术的演进全景
人工智能·算法·机器学习