046. 编写插入排序算法
插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于整理扑克牌。插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上通常使用in-place排序(即只需用到 O(1) 的额外空间的排序)。
C语言实现插入排序
#include <stdio.h>
// 插入排序函数
void insertionSort(int arr[], int n) {
int i, key, j;
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;
}
arr[j + 1] = key; // 插入key到正确的位置
}
}
// 打印数组的函数
void printArray(int arr[], int size) {
for (int 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;
}
代码说明
-
插入排序函数
insertionSort
: -
外层循环从第二个元素开始,假设第一个元素已经有序。
-
内层循环将当前元素(
key
)与已排序部分的元素进行比较,如果已排序部分的元素大于key
,则将该元素向后移动一个位置。 -
找到合适的位置后,将
key
插入到该位置。 -
打印数组函数
printArray
: -
用于打印数组的内容,方便查看排序前后的结果。
-
主函数
main
: -
定义了一个待排序的数组
arr
。 -
调用
insertionSort
函数对数组进行排序。 -
打印排序前后的数组。
示例运行
输入:
原始数组:
12 11 13 5 6
输出:
排序后的数组:
5 6 11 12 13
插入排序的特点
- 简单易实现:插入排序的逻辑简单,实现起来容易。
- 稳定性:插入排序是一种稳定的排序算法,即相等元素的相对顺序不会改变。
- 时间复杂度:最坏情况下(数组完全逆序)的时间复杂度为 O(n2)。最好情况下(数组已经有序)的时间复杂度为 O(n)。
- 空间复杂度:插入排序的空间复杂度为 O(1),因为它只需要一个额外的变量用于存储当前要插入的元素。
- 适应性:插入排序对部分有序的数组排序效率较高,因为它在数组已经接近有序时,内层循环的比较和移动次数会显著减少。
插入排序虽然效率不高,但它的实现简单,适合用于小规模数据的排序,也适合用于教学和理解排序算法的基本原理。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)