有序数组插入数据

题目:main函数中a数组的n个元素互不相同。函数insert(int a[],int n,int x)的 功能是:在一维有序数组a中插入x,插入x后数组a仍保持原来的有序性。

例如:调用insert函数前,main函数中a数组的元素为 12 9 4 3 0 -5
当x的值为1时,调用insert函数后,a数组的元素为 12 9 4 3 1 0 -5
调用insert函数前,main函数中b数组的元素为 -10 -4 2 7
当x的值为1时,调用insert函数后,b数组的元素为 -10 -4 1 2 7

解题的关键在于,如何判断数组是哪一种有序,是升序还是降序.接着就是对要插入元素找寻插入位置,找到后,那必然是对数组的移动操作,因此步骤如下

  1. 判断数组为何等顺序
  2. 找寻插入位置
  3. 将其他数组元素向后移动
  4. 将数组插入原来位置

这时我们想一下,如果是升序,那么前两个元素一定是第一个比第二个小,降序则反之,那么是不是可以通过这一点来判断呢?当然是可以的

int flag = a[0] > a[1];

这里假设是降序,那就是要找到一个要插入的元素(x),x比其中一个元素大的位置,而前一个位置就是该x要待的位置.

当然,在插入之前,需要将那个位置后的元素向后移动,因此我们应该是从后往前遍历
在这里插入图片描述
这里我们设置cur为当前指向数组最后一个元素的指针,而prev为最后一个元素的后一个.

在这里插入图片描述

只要满足x>a[i]的条件,cur和prev就都向左走
在这里插入图片描述

这里1<3,不满足条件,因此将x放在prev的位置
在这里插入图片描述

所以,要先判断插入位置,降序就是说,只要有比x小的数就要往后移动,x就要放在那个数前面,升序就是比它大的数要向后移动,因此,可以放在一起判断,减少冗余

for (i = n-1; i >= 0&&(flag? x > a[i]: x < a[i]); i--)
    {
        a[i + 1] = a[i];        
    }
    a[i + 1] = x;

最后程序如此:

void insert(int a[], int n, int x)
{
	int cur = n - 1, prev = n - 1 + 1;
    int flag = a[0] > a[1];

    for (cur = n-1; cur >= 0&&(flag? x > a[cur]: x < a[cur]); cur--)
    {
        prev = cur + 1;
        a[prev] = a[cur];        
    }
    a[prev] = x;
}

void print(int a[], int n)
{
    int i;
    for (i = 0; i < n; ++i)
        printf("%d\t", a[i]);
    printf("\n");
}
int main()
{
    int a[10] = { 12,9,4,3,0,-5 };
    int b[10] = { -10,-4,2,7 };
    int n, m, x;
    n = 6, m = 4, x = 1;
    print(a, n);
    insert(a, n++, x);
    print(a, n);
    print(b, m);
    insert(b, m++, x);
    print(b, m);
    return 0;
}

比较基础的代码,但是搞清楚逻辑也没有那么简单。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值