直接插入排序是插入排序的一种,下面是插入排序的一些特征:
- 平均时间复杂度:O(n^2)
- 最坏情况:O(n^2)
- 最好情况:O(n)
- 空间复杂度,最好最坏平均都为:O(1)
- 是否稳定:稳定
第k次排序后,前k个或k+1个元素有序,但可能不是最终位置
直接插入排序的基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
下面是直接插入排序的一个例子:
原序列 | 3 | 2 | 7 | 6 | 8 | |
---|---|---|---|---|---|---|
3 | 2 | 7 | 6 | 8 | ||
2 | 3 | 7 | 6 | 8 | ||
2 | 3 | 7 | 6 | 8 | ||
2 | 3 | 6 | 7 | 8 | ||
最终结果 | 2 | 3 | 6 | 7 | 8 |
由于空序列和只有一个元素的序列都是有序的,所以可以选择第二个元素开始进行插入。
下面是直接插入排序的代码:
/**
* arr 数组首地址
* len 数组长度
*/
void insert_sort(int *arr, int len)
{
int i, j;
for (i=1; i<len; i++) {
if (arr[i] < arr[i-1]) {
int temp = arr[i];
for (j=i-1; temp<arr[j] && j>=0; j--)
arr[j+1] = arr[j]; // 后移元素
arr[j+1] = temp; // 插入元素
}
}
}
测试代码,可直接复制后编译执行:
#include <stdio.h>
void show(int *arr, int len);
void insert_sort(int *arr, int len);
int main()
{
int len = 7;
int arr[] = {7, 10, 11, 9, -8, 2, 27};
insert_sort(arr, len);
show(arr, len);
return 0;
}
/**
* arr 数组首地址
* len 数组长度
*/
void show(int *arr, int len)
{
int i;
for (i=0; i<len; i++) {
printf("%4d", arr[i]);
}
printf("
");
}
/**
* arr 数组首地址
* len 数组长度
*/
void insert_sort(int *arr, int len)
{
int i, j;
for (i=1; i<len; i++) {
if (arr[i] < arr[i-1]) {
int temp = arr[i];
for (j=i-1; temp<arr[j] && j>=0; j--)
arr[j+1] = arr[j]; // 后移元素
arr[j+1] = temp; // 插入元素
}
}
}