排序算法---插入排序
原创不易,转载请注明出处。欢迎点赞收藏~
插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素分为已排序和未排序两部分,每次从未排序部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都插入到已排序部分,完成排序。
具体的插入排序算法如下:
- 从第一个元素开始,将其视为已排序部分。
- 取出下一个未排序元素,在已排序部分从后往前扫描,将大于该元素的元素向后移动,直到找到小于或等于该元素的位置。
- 将该元素插入到找到的位置。
- 重复步骤2和3,直到所有元素都插入到已排序部分。
插入排序的时间复杂度为O(n^2),其中n表示待排序元素的个数。最好情况下,如果待排序元素已经有序,那么插入排序的时间复杂度为O(n)。最坏情况下,如果待排序元素逆序,那么插入排序的时间复杂度为O(n^2)。 插入排序的空间复杂度为O(1),它只需要常数级别的额外空间用于存储临时变量。
值得注意的是,插入排序在处理小规模数据或者部分有序的数据时,表现优于其他复杂度更高的排序算法,因为它具有稳定性、原地排序等特点。然而,在面对大规模乱序数据时,插入排序的效率相对较低,不如快速排序、归并排序等高效排序算法。
以下是一个用C语言编写的插入排序的示例代码:
#include <stdio.h>
// 插入排序函数
void insertion_sort(int arr[], int n)
{
int i, key, j;
for (i = 1; i < n; i++)
{
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
int main()
{
int arr[] = {5, 2, 8, 12, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组:\n");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
insertion_sort(arr, n);
printf("\n排序后的数组: \n");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
putchar('\n');
return 0;
}
在这个示例中,我们定义了一个insertion_sort
函数来实现插入排序算法。该函数以一个整型数组和数组长度作为参数,并对数组进行原地排序。
在main
函数中,我们创建了一个示例数组arr
,然后调用insertion_sort
函数对数组进行排序。最后,我们使用printf
函数输出排序后的结果。
运行这段代码,你可以看到以下输出: