有序数组的插入操作

问题1:如何去理解设计有序数组的插入操作。

        话说上一节,首领在为自己的族人都分配好猎物后唯独少了自己的那份,这次首领学聪明了,在猿人们又一次捕获了猎物后,再次面对猎物的分配问题,首领站了出来先是使用冒泡排序将族人排成一列,然后从左到右和每个猿人比较身高,最后停留在比自己高的猿人后面,不得不赞叹这个部落的公平制度,连首领都不能有特权。(猿人按身高领取对应猎物)

                假设站在上帝视角我们知道在首领进入队伍前,猿人们的排列顺序为[144,145,146,148,148,149,150,157,163]。如果首领的身高为162,应该站在哪里呢?首先可以从左到右与每个猿人进行比较,直到遇到比自己高的猿人,比自己高的所有猿人都得向右移动一格,为首领留出站立的空间,至此插入成功,话不多说,直接演示代码。

问题2:具体代码。

        

#include<stdio.h>
int main(void)
{
    int n = 10;
//在场所有猿人的数量
    int arr[10] = { 144,145,146,148,148,149,150,157,163 };//已经排列好的猿人。
    int height = 162;//首领的身高
    int flag = 1;//检测有没有身高超过首领的猿人,1代表没有。
    for (int i = 0; i < n; i++)//从第一个猿人开始找。
        if (height < arr[i])//如果找到,开始插入操作。
        {
            for (int j = n - 1; j >= i + 1; j--)
//从 下标为i的猿人开始到下标为n-1的猿人,都在下行的操作
                arr[j] = arr[j - 1];//从最右边的猿人到下标为i的猿人集体往后移动一格。
            arr[i] = height;//首领插入这格。
            flag = 0;//发现存在比首领高的猿人。
            break;//退出循环,无需比较。
        }

    if (flag)//如果没有发现比首领高的人则执行下一句。
        arr[9] = height;//首领直接站在最右边。


    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
//输出验证。

    return 0;

}

如图下为输出结果。

问题三:可能存在的疑问。

        同学们可能回想,能不能直接使用冒泡排序一次性搞定这个问题,答案是可以的,只要把首领放在arr[9],然后再进行冒泡排序就可以了,但是如果首领是最矮的那个猿人,要经历完整的冒泡排序,效率十分低效,但是我们可以将除了首领外的猿人,往下标大的位置移动一位(已经排列好),将arr[0]让给首领,则重新使用冒泡排序只运行一次循环便排列成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值