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