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

相关推荐
wen__xvn1 天前
代码随想录算法训练营DAY14第六章 二叉树 part02
数据结构·算法·leetcode
Ka1Yan1 天前
[数组] - 代码随想录(2-6)
数据结构·算法·leetcode
漫随流水1 天前
leetcode算法(104.二叉树的最大深度)
数据结构·算法·leetcode·二叉树
机器学习之心HML1 天前
鲸鱼算法(WOA)优化Kriging模型
算法
DYS_房东的猫1 天前
《 C++ 零基础入门教程》第6章:模板与 STL 算法 —— 写一次,用万次
开发语言·c++·算法
Tim_101 天前
【算法专题训练】37、前缀树&二叉树
算法
NineData1 天前
第三届数据库编程大赛-八强决赛成绩揭晓
数据库·算法·代码规范
雍凉明月夜1 天前
深度学习之目标检测yolo算法Ⅱ(v4)
深度学习·算法·yolo·目标检测
FAFU_kyp1 天前
Rust 的 引用与借用
开发语言·算法·rust
执携1 天前
数据结构 -- 数组(Array)
数据结构