(C语言)对一个已经排好序的数组,输入一个元素,将该元素按原来的排序规则将它插入数组中。

输入描述:输入包含三部分。第一部分先输入n,表示数组中元素的个数,接着输入n 个已经排好序的树。数组中最大个数为20,第二部分为待插入的数据。第三部分为待插入的元素。

输出描述:新的排好的数组元素。

样式输入:

5

1 2 6 7 9

3

样式输出:

1 2 3 6 7 9

#include<stdio.h>
int main(void)
{
	int n,a[20]={0},k,i,j;
	scanf("%d",&n);//输入元素个数
	for(i=0;i<n;i++)
	    scanf("%d",&a[i]);//输入有序数组
	scanf("%d",&k);//输入待插入元素
	for(i=0;i<n;i++)
	{
		if(a[i]>k)//若出现a[i]>k
		{
		  for(j=n;j>=i;j--)
		  {
			a[j]=a[j-1];//则将从i到n的每个元素往后移动一位
		  }
			a[i]=k;break;//再将k插入a[i]位置。
		  }
	}
	
	for(i=0;i<=n;i++)
	    printf("%d",a[i]);//输入新的数组元素
	return 0;
}

时隔一年,再来看这个题.有了一个新的想法,使用"二分查找"能够让时间复杂度从n2降低为logn.直接上注释和代码吧.

#include<stdio.h>
int main(void)
{
    int n,a[20]= {0},k,i,j;
    scanf("%d",&n);//输入元素个数
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);//输入有序数组
    scanf("%d",&k);//输入待插入元素

    if(n==0)//如果数组中没有元素
        a[0]=k;//直接插入到第一个位置
    else if(k<a[0])//比第一个值还要小,先将所有值后移一位,将k插入到最前面
    {
        for(j=n-1; j>=0; j--)
            a[j+1]=a[j];
        a[0]=k;
    }
    else if (k>=a[n-1])//比最后一个值还要大,直接将k插入到末尾
		a[n]=k;
    else
    {
        int i = 0,j=n-1,mid;//两个遍历指针
        while(i<=j)
        {
            mid=i+(j-i)/2;//以前是写成(i+j)/2,但是可能i+j是个很大的值,怕越界.
            if(a[mid]<k)//K大于中间值,则在右边查找
                i=mid+1;
            else if(k<a[mid])//小于中间值,则在左边查找
                j= mid-1;
            else if(k == a[mid])
		//这是关键一步,主要是要找到第一个比k大的值,所以搜索范围一直在往左缩小,继续往左边查找
            j=mid -1;
        }//本循环结束后,i的位置就是从左到右,第一个比k大的位置
        //从i的位置开始,所有的值往后空出一个位置
        for(int j = n-1; j>=i; j--)
            a[j+1]=a[j];
        a[i]=k;//将k值插入
    }
    for(i=0; i<=n; i++)
        printf("%d",a[i]);//输入新的数组元素
    return 0;
}

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值