C语言插入排序及其优化
插入排序算法详解
插入排序是一种简单直观的排序算法。它通过构建有序序列,将未排序部分的元素插入到已排序部分的正确位置,直到所有元素排序完成。下面是插入排序的关键点及其实现细节。
算法思想
- 从第二个元素(下标为 1)开始,假定左侧的子数组已排序。
- 将当前元素与已排序部分逐一比较,找到插入点。
- 将插入点后的元素依次后移,为当前元素腾出位置。
- 重复上述过程,直至所有元素排序完成。
直接插入法排序
void insert_sort(int array[], int size) {
for (int i = 1; i < size; i++) {
int temp = array[i]; // 当前待插入的元素
int j = i - 1;
// 查找插入位置
while (j >= 0 && temp < array[j]) {
array[j + 1] = array[j]; // 元素后移
j--;
}
array[j + 1] = temp; // 插入元素
}
}
优化方法
插入排序的主要时间消耗来源于:
- 查找插入位置的比较操作。
- 元素后移的赋值操作。
可以通过以下方法进行优化:
二分插入法排序
#include <stdio.h>
void insert_sort(int array[], int size) {
for (int i = 1; i < size; i++) {
int temp = array[i];
int left = 0, right = i - 1;
// 二分查找插入位置
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] > temp)
right = mid - 1;
else
left = mid + 1;
}
// 将大于 temp 的元素右移
for (int j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
array[left] = temp; // 插入到正确位置
}
}
时间复杂度分析
操作 | 最好情况(数组已排序) | 最坏情况(数组逆序) | 平均情况 |
---|---|---|---|
比较次数 | O(n)O(n)O(n) | O(n2)O(n^2)O(n2) | O(n2)O(n^2)O(n2) |
移动次数 | O(n)O(n)O(n) | O(n2)O(n^2)O(n2) | O(n2)O(n^2)O(n2) |
尽管插入排序在最坏情况下的复杂度是 O(n2)O(n^2)O(n2),但在以下情况下表现良好:
- 数据接近有序时,比较和移动次数大幅减少。
- 数据量较小时,插入排序的简单性使其执行速度不逊于复杂的排序算法。