1. 算法思想
直接插入排序的思想很直观:将未排序的部分依次插入到已排序的部分中,始终保持已排序部分是有序的。通过多次插入操作,最终实现整个序列的排序。
2. 算法步骤
-
初始状态: 将第一个元素视为已排序部分,剩余元素为未排序部分。
-
从未排序部分取元素: 依次从未排序部分中取出一个元素。
-
插入操作: 将取出的元素插入到已排序部分的适当位置,使得插入后仍然保持有序。
-
重复步骤2和3: 重复进行取元素和插入操作,直到未排序部分为空。
3. 代码
//直接插入排序(稳定)
void insertSort(int a[], int n) {
int j, temp;
for (int i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
temp = a[i];
for (j = i - 1; j >= 0; j--) {
if (a[j] > temp) {
a[j + 1] = a[j];
}
}
a[j + 1] = temp;
}
}
}
4. 时间复杂度
直接插入排序的时间复杂度取决于待排序数据的初始顺序。
最好情况:如果数据已经有序,插入操作只需要比较一次,时间复杂度为O(n)。
最坏情况:数据完全逆序,插入操作需要比较和移动元素的次数最多,时间复杂度为O(n^2)。
平均情况:直接插入排序的时间复杂度为O(n^2)。
空间复杂度:O(1)
5. 总结
直接插入排序是一种简单却高效且具有稳定性的排序算法,特别适用于小规模数据或部分有序的数据集合。其思想简单易懂,通过逐步插入元素并保持有序,实现了对序列的排序。在实际应用中,您可以根据数据的特点来选择合适的排序算法。