问题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]让给首领,则重新使用冒泡排序只运行一次循环便排列成功。
4919

被折叠的 条评论
为什么被折叠?



