排序之直接插入排序

直接插入排序:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录增加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':' ');
        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值