一、插入排序概念
直接插入排序(Insertion Sort)是一种简单的排序算法,它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
二、插入排序原理
1. 初始化:将数组的第一个元素视为已排序的部分。
2. 遍历:从第二个元素开始,每次选择一个元素,将其插入到已排序部分的适当位置。
3. 比较和移动:为了找到新元素的正确位置,从后向前比较新元素与已排序部分的元素,如果新元素较小,则将较大的元素向后移动一位。
4. 重复:重复上述过程,直到所有元素都被插入到已排序部分。
三、代码示例
#include <stdio.h>void insertionSort(int *arr, int size)
{int key = 0;int i, j;for (i = 1; i < size; i++){key = arr[i]; /*当前待插入的元素*/for (j = i - 1; arr[j] > key && j >= 0; j--) /*将大于key的元素向后移动一位*/{arr[j + 1] = arr[j];}arr[j + 1] = key;}
}void print(int *arr, int size)
{for (int i = 0; i < size; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{int arr[] = {5, 4, 2, 3, 1, 6, 0};int size = sizeof(arr) / sizeof(int);printf("插入排序前的数组:");print(arr, size);printf("插入排序后的数组:");insertionSort(arr, size);print(arr, size);return 0;
}
运行结果:
四、插入排序复杂度
时间复杂度
最好情况:当输入数组已经是排序好的时候,时间复杂度为O(n)。
平均情况和最坏情况:当输入数组是随机或逆序的时候,时间复杂度为O(n²)。
空间复杂度
直接插入排序是原地排序算法,空间复杂度为O(1)。