直接插入排序:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录增加1的有序表。
举一个生动的例子:
大学军训:刚来大学时,大家都是从五湖四海过来,兴奋激动不已,军训第一天,都满怀期待来到操场集合,都想站前排展现一下下自己,于是乎一开始大家就先来先到,一个挨着一个站着,参差不齐,甚是难看,结果教官来了,看后有点生气,然后急中生智,就雷厉风行:“第二个,王小二,你要是比前面的同学矮点就站出来,王小二前面的同学,如果王小二站出来了,自己就看看,如果比王小二高就往后一步走(假设一个人刚好占据了一步的距离空间),结果王小二一看,比最前面的白大褂高一点就没有站出来了。然后,从王小二后面的每一位同学,依次看看,如果比前面的同学矮点就出列,出列同学前面的同学好好看看,如果比出列同学高的同学,自觉往后移动一步,然后出列的同学站到最后空缺的位置…”不到十分钟,一个由低到高的队形出来了,这个教官将直接插入排序法灵活地运用到了生活中。
@在第一轮中,5>3,5不用出列,直接进入下一轮。
@在第二轮中,4<5,4出列,当前空缺位置为int vacancy = 2。
@比较5>4,5后移一位,vacancy = 1。
@比较3<4,不用移动,然后将出列的4放到空缺位置。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
void pai(int array[],int n)
{
//此循环从1开始,就是将0下表的元素当做一个参照
for(int i=1;i<n;i++)
{
if(array[i]<array[i-1])将当前下标的值与参照元素比较,如果小于就进入里面
{
int vacancy=i;//用于记录比较过程中那个空缺出来的位置
int sentry=array[i];//设置哨兵,将当前下标对应的值赋给哨兵
for(int j=i-1;j>=0&&array[j]>sentry;j--)//这个循环很关键,从当前下标之前的一个元素开始倒序遍历,比较结果如果比当前大的,就后移
{
vacancy=j;
array[j+1]=array[j];//后移比当前元素大的元素
}
array[vacancy]=sentry;//将哨兵,也就是当前下标对应的值置入空缺出来的位置
}
}
}
int main()
{
int a[100];
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
pai(a,n);
for(int i=0;i<n;i++)
{
printf("%d%c",a[i],i==n-1?'\n':' ');
}
}
}