算法思路:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中过,直到全部记录插入完成。
空间复杂度:O(1)
时间复杂度:O(n^2)
算法稳定性:稳定
实现代码:
#include <stdio.h> // 输入输出
#include <windows.h> // system函数
#define MaxSizeA 5
// 插入排序
void InsertSort(int *arr, int n)
{
int i, j, temp;
for (i = 1; i < n; i++)
{
// 升序前插排序,将后面未排序的元素依次向前比较
if (arr[i] < arr[i - 1])
{
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--) // 从后往前找
{
arr[j + 1] = arr[j]; // 所有比temp大的元素都往后移
}
arr[j + 1] = temp; // 由于for循环中跳出循环前执行了j-1,所有此处为j+1
}
}
}
// 打印
void PrintList(int *A, int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d", A[i]);
printf("\n");
}
}
int main()
{
int A[MaxSizeA] = {99, 89, 66, 77, 55};
// 插入排序
InsertSort(A, MaxSizeA);
PrintList(A, MaxSizeA);
printf("\n");
system("pause"); // 避免exe程序自动退出
return 0;
}