1. 什么是插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法。它将待排序的元素分为已排序和未排序两个部分,逐步将未排序的元素插入到已排序的部分中,直到所有元素都被插入到正确的位置,完成排序。
2. 插入排序的原理
插入排序的基本思想是:
- 将数组的第一个元素视为已排序部分。
- 依次遍历未排序部分的元素。
- 对于每个未排序元素,将它与已排序部分的元素从右到左进行比较。
- 如果已排序部分的元素大于当前未排序元素,则将已排序元素向右移动一个位置,为当前元素腾出插入的位置。
- 重复步骤4,直到找到已排序部分中的元素小于或等于当前未排序元素的位置。
- 将当前未排序元素插入到找到的位置。
- 重复步骤2到步骤6,直到所有未排序元素都被插入到已排序部分。
3. 插入排序流程图
4. 时间空间复杂度
插入排序的时间复杂度为O(n^2),其中n是待排序元素的数量。具体地说,最坏情况下,当输入数组完全逆序排列时,需要进行n(n-1)/2次比较和移动操作。最好情况下,当输入数组已经有序时,只需要进行n-1次比较,没有需要移动的元素。
插入排序的空间复杂度为O(1),即它只需要常量级别的额外空间来存储一些辅助变量,与输入规模无关。这使得插入排序在空间有限的情况下非常有用。
5. C语言实现
int main(void)
{
unsigned int numbers[MAX_TOTAL_NUMBER];
int i, j;
if (generate_data(numbers, MAX_TOTAL_NUMBER) < 0)
return -1;
print_data(numbers, MAX_TOTAL_NUMBER);
/* 以下是插入排序算法实现部分 */
for (i = 1; i < MAX_TOTAL_NUMBER; i++)
{
unsigned int value = numbers[i];
for (j = i - 1; j >= 0 && value < numbers[j]; j--)
{
numbers[j + 1] = numbers[j];
}
numbers[j + 1] = value;
}
print_data(numbers, MAX_TOTAL_NUMBER);
return 0;
}
6. 应用场景
如果待排序数据具有以下特别时,插入排序可能比其他高效排序算法更具优势。
- 数据规模较小:对于小规模的数组,插入排序的常数因子较小,因此实际运行时间可能比其他复杂度较低但有较高常数因子的排序算法更短。
- 数组已经部分有序:如果输入数组已经部分有序,插入排序的时间复杂度可以近似为O(n),因为只需要进行少量的比较和移动操作。