插入排序是一种简单直观的排序算法,通过将未排序的元素逐个插入到已排序的序列中的适当位置来完成排序。在C语言中,插入排序可以被实现为一个函数,该函数遍历数组,将每个元素与其左侧已排序的元素进行比较,并在适当的位置插入。
插入排序的工作原理可以形象地比喻为军训时按身高排列队伍。首先选择一个基准(例如,最帅的男生),然后让其他学生逐一与基准比较身高,找到自己的位置,从而形成一个有序的队列。
插入排序的过程可以用以下步骤描述:
1. 将数组的第一个元素视为已排序部分,从第二个元素开始。
2. 取出第二个元素,与第一个元素比较,如果它更小,则交换位置;否则保持不变。
3. 继续取出下一个元素,与已排序的序列中的元素依次比较,找到合适的位置并插入。
4. 重复以上步骤,直到所有元素都被插入到正确的位置。
插入排序的时间复杂度为O(n^2),在最坏的情况下(即输入数组逆序)需要进行n(n-1)/2次比较和交换。然而,对于部分有序的数组,插入排序的效率相对较高,接近线性时间复杂度O(n)。
插入排序是稳定的排序算法,这意味着相等的元素在排序后保持原有的相对顺序。例如,在排序过程中,如果有两个相同的数值,它们在序列中的相对位置不会因为排序而改变。
以下是C语言实现插入排序的代码:
```c
#include<stdio.h>
void insert_sort(int arr[], int n) {
int i, j, temp;
for (i = 1; i < n; i++) {
temp = arr[i];
for (j = i - 1; temp < arr[j] && j >= 0; --j) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
#define LENGTH 8
int main() {
int i, j;
int arr[LENGTH] = {6, 5, 3, 1, 8, 7, 2, 4};
// 排序前打印数组
for (i = 0; i < LENGTH; i++)
printf("%d", arr[i]); printf("\n");
insert_sort(arr, LENGTH);
// 排序后打印数组
for (i = 0; i < LENGTH; i++)
printf("%d", arr[i]); printf("\n");
return 0;
}
```
在这个代码示例中,`insert_sort` 函数接收一个整数数组和其长度,然后执行插入排序。`main` 函数中初始化了一个数组并调用 `insert_sort` 进行排序,最后打印排序后的结果。通过这种方式,我们可以看到插入排序如何将无序的数组转换为有序的序列。