简要描述和分析,做记录用。
算法说明
通常人们整理纸牌的方法是一张一张的来,将每一张牌插入到其它已经有序的牌中的适当位置。在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位,这种算法称为插入算法。
与选择排序一样,当前索引左边的所有元素都是有序的,但它们的最终位置还不确定,为了给更小的元素腾出空间,它们可能还会被移动。当索引到达数组的最右端时,整个数组就已经完成了排序。
和选择排序不同的是,插入排序所需的时间取决于输入元素的初始顺序。对一个很大且其中的元素已经有序(或者接近有序)的数组进行排序会比随机顺序或是逆序数组进行排序要快的多。
算法实现
插入排序算法
/*插入排序(升序)*/
void insert_sort(int *array, int len)
{
int i, j;
for (i = 1; i < len; ++i)
{
/*
* 将array[i]插入到array[i-1]、array[i-2]...之中
* 始终保存a[i]之前处于一个有序状态.
*/
for (j = i; j>0&&(array[j]<array[j-1]); j--)
{
int tmp;
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
主程序
#include <stdio.h>
void print_array(int *array, int len)
{
int i;
for (i = 0; i < len; ++i)
{
printf("%d ", array[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int array[10] = {2, 10, 5, 8, 21, 19, 14, 30, 25, 1};
int len = sizeof(array)/sizeof(array[0]);
printf("排序前:\n");
print_array(array, len);
insert_sort(array, len);
printf("排序后:\n");
print_array(array, len);
return 0;
}
效果如下