输入描述:输入包含三部分。第一部分先输入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;
}