基本思想:
每一次将待排序的对象,按其关键码的大小,插入到前面已经排好序的一组对象的合适位置上,直到全部对象插入为止,即边插入边排序
基本操作:
- 在有序序列中插入一个元素,保持序列有序,有序长度不断增加
- 起初,a[0]是长度为1的有序序列,然后,逐步将a[1]至a[n-1]插入到有序序列中
- 再插入a[i]前,数组的前半段(a[0] - a[i-10])是有序段,a[i] - a[n-1]是待插入的无序段
- 插入a[i]使a[0]-a[n-1]有序,也就是要为a[i]找到有序位置j(0<=j<=i),即将a[i]插到a[j]的位置上
代码如下:
#include <stdio.h>
#include <assert.h>
void InsertSort(int* ar, int len)
{
assert(ar != nullptr);
for (int i = 1; i < len; ++i)
{
int j = i - 1;
int tmp = ar[i];
while (j >= 0)
{
if (ar[j] > tmp)
{
ar[j + 1] = ar[j];
j--;
}
else
{
break;
}
}
ar[j + 1] = tmp;
}
}
void My_print(int* ar, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%3d", ar[i]);
}
printf("\n");
}
int main()
{
int ar[] = { 34,45,98,10,4,64,83,49,20,39 };
int len = sizeof(ar)/sizeof(ar[0]);
InsertSort(ar, len);
My_print(ar, len);
return 0;
}