文章目录
- 🔍什么是插入排序?
- 🔑插入排序的优缺点
- 🚀实现插入排序
🔍什么是插入排序?
插入排序是一种简单的排序算法,它的基本思想是:将待排序的元素,从第二个元素开始,依次与前面的已排好序的元素进行比较,将它插入到相应的位置中,直到所有的元素排序完成。在这个过程中,所有比插入元素大的元素都会依次后移一位,留出空间给它插入。
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移.
🔑插入排序的优缺点
插入排序性能分析
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度:O(N^2)
- 空间复杂度:O(1),它是一种稳定的排序算法
- 稳定性:稳定
插入排序的优点在于简单、易于实现。对于已经有序的数组来说,插入排序只需要进行比较操作而不需要交换操作,因此速度非常快。但是对于无序数组来说,插入排序的时间复杂度会比较高,不太适合大规模的排序。插入排序的时间复杂度是O(n^2),但是在插入小规模数据时,插入排序比较高效。并且,插入排序是一种稳定的排序算法,即排序前后,每个元素的相对位置不会发生变化。所有他是小数据量排序的王者。
🚀实现插入排序
- 具体实现过程如下:
- 从第二个元素开始,将当前元素作为待插入元素,存储在一个临时变量中。
- 将待插入元素与已排序的子序列中的元素进行比较,找到待插入位置。
- 将插入位置后的元素依次交换,为待插入元素腾出插入位置。
重复步骤 1-3,直到所有元素都插入到了已排序的子序列中,得到最终有序序列。
// 插入排序算法实现
void InsertSort(int* a, int n)
{
// 循环遍历输入数组,共进行n-1轮插入操作
for (int i = 0; i < n-1; ++i)
{
// 在[0, i]范围内是有序的,取 a[i+1] 的值进行比较并插入
int end = i; // end 表示有序区间的最后一个元素下标
int tmp = a[i+1]; // 记录需要插入的元素值
// 在有序区间内查找插入位置并移动元素
while (end >= 0)
{
if (a[end] > tmp) // 将比tmp大的元素向后移动
{
a[end + 1] = a[end];
--end; // 记录待插入元素应该处于的位置
}
else // 如果找到了合适的插入位置,跳出循环
{
break;
}
}
// 将 tmp 插入到待插入位置上
a[end + 1] = tmp;
}
}
上述代码的实现过程就是对于第i个元素,将其插入到已排好序的前i-1个元素中,使得前i个元素依旧有序。
- 插入排序也是其他高级算法的基础,掌握它对于深入学习和研究排序算法是非常有帮助的。