C语言插入排序算法详解及完整代码实现
插入排序是C语言中最基础的排序算法之一。它通过构建有序序列,对未排序数据逐个插入到合适位置,最终完成整个数组的从小到大排序。本文将图解其核心思想,并提供可直接运行的C语言代码实现。
算法核心思想
插入排序的基本逻辑是将一个无序的数组划分为两个部分:
- 已排序子数组:初始时仅包含第一个元素。
- 待插入元素:从第二个元素开始,依次遍历剩余元素。
算法的核心在于将“待插入元素”放入“已排序子数组”中的正确位置。在放置过程中,需要将已排序区间中大于该元素的数据向右移动,腾出空间。这个过程重复直到所有元素都被处理完毕。
具体执行步骤演示
为了直观理解,我们以数组 [3, 2, 4, 1] 为例,说明从小到大排序的三轮操作过程:
第1轮:处理元素 2
- 初始状态:
[3]为已排序部分,[2, 4, 1]为待插入部分。 - 比较:2 小于 3,需要向前移动。
- 插入:将 3 后移,把 2 插入到索引 0 的位置。
- 结果:
[2, 3]已排序,剩余[4, 1]。
第2轮:处理元素 4
- 初始状态:已排序
[2, 3],待插入[4, 1]。 - 比较:4 大于 3,无需移动。
- 插入:4 已经处于正确位置。
- 结果:
[2, 3, 4]已排序,剩余[1]。
第3轮:处理元素 1
- 初始状态:已排序
[2, 3, 4],待插入[1]。 - 比较:1 小于 4、3 和 2,需要移动到最前。
- 插入:将 2、3、4 全部向后移动一位,将 1 放在索引 0。
- 结果:
[1, 2, 3, 4],排序结束。
C语言代码实现
以下是完整的C语言实现代码。代码中使用了 #define N 8 定义数组长度,并提供了详细的行级注释以便理解参数传递和循环逻辑。
#include <stdio.h>
#include <stdlib.h>
#define N 8
// 函数声明:a为数组指针,n为数组元素个数
void insert_sort(int a[], int n);
// 插入排序实现(从小到大)
void insert_sort(int a[], int n)
{
// 外层循环:从第1个索引开始,逐个处理后续元素
for (int i = 1; i < n; i++)
{
// 确定当前待插入元素 a[i] 应该去的正确位置 j
int j = 0;
while ((a[j] < a[i]) && (j < i))
{
j++;
}
// 如果当前位置 i 不是应插位置 j,则需要移位
if (i != j)
{
int temp = a[i]; // 暂存待插入元素
// 内部循环:将 [j, i-1] 区间的元素整体后移一位
for (int k = i; k > j; k--)
{
a[k] = a[k - 1];
}
// 将暂存的元素放入空出的位置 j
a[j] = temp;
}
}
}
int main()
{
int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
// 调用排序函数
insert_sort(num, N);
// 打印排序后的结果
for (int i = 0; i < N; i++)
{
printf("%d ", num[i]);
}
printf("\n");
system("pause");
return 0;
}
算法特性总结
插入排序具有以下几个关键特点:
- 稳定性:它是一种稳定的排序算法。如果在排序过程中遇到相等元素,新元素会排在原相等元素的后面,不会改变它们原有的相对顺序。
- 时间复杂度:平均和最坏情况下为 $O(N^2)$,最好情况(数组已有序)为 $O(N)$。
- 适用场景:适合数据量较小或基本有序的排序场景。对于大规模无序数据,效率不如快速排序或归并排序。
以上就是关于C语言插入排序算法的详细解析与代码示例,更多关于基础算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













