直接插入排序(一种稳定的排序方法)
算法思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止;
下面为代码实现(每一次将需要插入的关键字插入到前面已经排好序的序列中合适的位置)
void insertsort(int a[], int sz)
{
int i = 0;
int j = 0;
for (i = 2; i < sz; i++)//依次从a[2]~a[sz]插入到前面已经排序的序列
{
if (a[i] < a[i - 1])//若a[i]关键字码小于前驱,将a[i]插入有序表
{
a[0] = a[i];//复制为哨兵
for (j = i - 1; a[0] < a[j]; --j)//从后往前查找待插入的位置
{
a[j + 1] = a[j];//向后挪位
}
a[j + 1] = a[0];//复制到插入的位置
}
}
}
完整测试代码
#include<stdio.h>
void insertsort(int a[], int sz)
{
int i = 0;
int j = 0;
for (i = 2; i < sz; i++)//依次从a[2]~a[sz]插入到前面已经排序的序列
{
if (a[i] < a[i - 1])//若a[i]关键字码小于前驱,将a[i]插入有序表
{
a[0] = a[i];//复制为哨兵
for (j = i - 1; a[0] < a[j]; --j)//从后往前查找待插入的位置
{
a[j + 1] = a[j];//向后挪位
}
a[j + 1] = a[0];//复制到插入的位置
}
}
}
int main()
{
int i = 0;
int a[] = {0,49,38,65,97,76,13,27 };
int sz = sizeof(a) / sizeof(a[0]);
printf("原始数组为:");
for (i = 1; i < sz; i++)
printf("%d ", a[i]);
insertsort(a,sz);
printf("\n直接插入排序后的数组为:");
for (i = 1; i < sz; i++)
printf("%d ", a[i]);
return 0;
}
为了方便看到代码每一趟排序的过程我加了一段输出代码得到的结果(跟我画的图是一样的):