直接插入排序 :
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
C语言实现
#include<stdio>
#define MAX 100
void InsertSort(int *R,int n)
{
/* 对数组R中的元素R[1]..R[n-1]按递增序进行插入排序*/
int i,j;
/*空出哨位R[0]*/
for(i=n;i>=1;i--)
R[i]=R[i-1];
/* 依次插入R[2],…,R[n] */
for(i=2;i<=n;i++)
/* 若R[i]大于等于有序区中所有的R,则R[i]应在原有位置上,否则进行插入*/
if(R[i]<R[i-1])
{
/* R[0]是哨兵,保存R[i] */
R[0]=R[i];
j=i-1;
/* 从右向左在有序区R[0]..R[-1]中查找R[i]的插入位置 */
while(1)
{
/* 将关键字大于R[i]的记录后移 */
R[j+1]=R[j];
j--;
/* 当R[i]≥R[j]时终止 */
if(R[0]>=R[j])
break;
}
/* R[i]插入到正确的位置上 */
R[j+1]=R[0];
}
/*元素复位*/
for(i=0;i<n;i++)
R[i]=R[i+1];
}
int main()
{
int R[MAX]={1,82,63,4,65,69,37,98,39,46};
InsertSort(R,10);
}