直接插入排序
当插入第 i(i>=1)
个元素时,前面的 array[0],array[1],…,array[i-1]
已经排好序,此时用 array[i]
的排序码与 array[i-1],array[i-2],…
的排序码顺序进行比较,找到插入位置即将 array[i]
插入,原来位置上的元素顺序后移
代码实现:
Sort.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
//打印
void PrintArr(int* arr, int n);
//直接插入排序
void InsertSort(int* arr, int n);
Sort.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sort.h"
//打印
void PrintArr(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//直接插入排序
//最差情况:O(n^2)
//最好的情况:O(n)
void InsertSort(int* arr, int n)
{
//n-2
for (int i = 0; i < n - 1; i++)
{
int end = i;
int tmp = arr[end + 1];
while (end >= 0)
{
if (arr[end] > tmp)
{
arr[end + 1] = arr[end];
end--;
}
else {
break;
}
}
//end == -1的时候跳出循环,arr[end + 1] = arr[0]
arr[end + 1] = tmp;
}
}
test.c
int main()
{
int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };
int n = sizeof(a) / sizeof(int);
printf("排序前:");
PrintArr(a, n);
InsertSort(a,n);
printf("排序后:");
PrintArr(a, n);
return 0;
}
直接插入排序的特性总结
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度:O(N2)
- 空间复杂度:O(1)