直接插入排序是稳定的排序方法。
基本思路:依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完位置,得到一个新的有序序列。
算法的思路:
1.设置监视哨x,将待排序的数据赋给x,对于整个数组的排序而言,一般选第二个数据;
2.设置开始查找的位置j = i - 1;
3.在数组中先前扫描,扫描中将第j个记录后移,并且j--,为下一次循环做准备,直到x>=buf[j]为止;
4.将x插入在j+1的位置。
#include<stdio.h>
#define Type char
void zj_insert(Type *buf, int n)
{
int i,j;
Type x ;
for(i = 1; i < n; i++) //从数组中第二个数开始排序,进行n-1趟排序
{
x = buf[i]; //设置监视哨,把待插入的数据赋值给它
j = i - 1; //从i-1开始往前比较
while(x < buf[j]) //确定插入位置。直到x>=buf[j]为止。
{
buf[j + 1] = buf[j];//如果x < buf[j],将第j个元素往后移,
j--; //并且j--为下一次比较做准备。
}
buf[j + 1] = x; //插入待排序的数
}
}
int main()
{
int i;
Type num[11] = "asdfghjkloq"; //{1,11,23,32,24,3,5,8,10,16,22}
printf("Original array:");
for(i = 0; i < 11; i++)
printf("%c ", num[i]); //注意输出格式的替换
printf("\n");
zj_insert(num, 11);
printf("Sorted array:");
for(i = 0; i < 11; i++)
printf("%c ", num[i]); //注意输出格式的替换
printf("\n");
return 0;
}