插入排序是简单排序的一种,其主要是对少量数据进行排序处理,大量数据时没有优势。插入排序就像打扑克,摸起一张牌看到然后按照手里的牌的顺序位置将此牌再插入到适当位置。是一种先确定数据,再确定位置的排序算法。与选择排序算法不同。
下面的代码实现了插入排序的简单练习。
#include <stdio.h>
#define MAXSIZE 50
int *Insert_sort(int *s, int n);
int main(void)
{
int n, i;
int s[MAXSIZE+1]; //多1个辅助元素
printf("插入排序练习\n");
printf("输入你想排序的数字个数:");
scanf("%d", &n);
getchar();
printf("请依次输入待排序数据\n");
for(i=1; i<n+1; i++) //元素0作为辅助元素
{
scanf("%d", &s[i]);
}
Insert_sort(s, n);
printf("排序好的数据输出为:\n");
for(i=1; i<n+1; i++)
{
printf("%d ", s[i]);
}
printf("\n");
}
int *Insert_sort(int *s, int n)
{
int i,j;
for(i=2; i<n+1; i++) //i下标代表选择的那个待排序的元素
{
s[0] = s[i];
j = i - 1; //j下标前面那部分代表以排序好那部分
while(s[0] < s[j])
{
s[j+1] = s[j]; //元素后移
j--;
}
s[j+1] = s[0]; //插入元素
}
}
插入排序主要由两部分构成,一部分是比较操作,另一部分是移动操作。进行一次比较的工作量大些,移动工作量小些。
它的开销也小,只需要一个备用单元,就是程序中的数组下标0的元素。另外还需要两个辅助变量就是排序经常用到的i和j,对存储器资源比较紧张的嵌入式系统是适合的。
另外,插入排序的时间复杂度可以看出来与数据元素的多少成正比。其时间复杂度为O(n^2)。插入排序支持静态排序,也支持动态排序,就跟打扑克摸牌一样。