数列有序!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 152555 Accepted Submission(s): 62085
Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
Sample Input
3 3
1 2 4
0 0
Sample Output
1 2 3 4
今天这道题我要好好的讲一下!
这道题有没有同学是用的数组整体往后移的算法呢?
整体往后移没有问题!但是用的是二重循环耶!
假如我输入的n为99,插入的m值在第二位咋办?
例如:
99 2
1 3 4 5 6 7 8 9…100
难道要把后面的98位数字在数组中整体往后移吗?我想想都可怕呀!!
那时间复杂度也太长啦吧!
有没有更简洁的做法呢???
答案是有的
那就是按照题目的条件来输出呀!
具体怎么做!看代码
#include<iostream>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m&&(n||m))
{
int a[105];//为了避免数组越界,大于等于101即可
int i=0;
while(n--)
{
int temp;
cin>>temp;
a[i++]=temp;
}
int j,count=0;
//count的作用就是标记
//有三种情况
//1,插入的数在最前面
//2,插入的数在中间
//3,插入的数在末尾
for(j=0;j<i;j++)
{
if(a[j]>m&&count==0)
//为了防止插入过后继续插入m值(因为后面的有序数都是大于m的),故增加一个count作为一个限制条件,保证m只在某有序数(该数大于m)前且只插入一次
{
count++;
cout<<m<<" ";
j--;//如果m不在末尾插入,这里一定要减一个1
}
else
{
if(j==i-1&&count!=0)//这里主要是为了保证格式正确
cout<<a[j]<<endl;
else
cout<<a[j]<<" ";
}
}
if(count==0)//count的另一作用是保证如果m插在末尾的话,要保证格式正确,即最后一个数字后面不得有空格!
cout<<m<<endl;
}
return 0;
}
综上所述,总体思想是不需要动用数组的插入算法来大费周折
我保证输出的时候是按照有序数输出即可!
最终我AC掉这道题!太开心啦!
总所周知,数组适合查找,不适合插入和删除!
所以如果要数组大量的往后移!一般应该是不可取的!!!
如果你有更好的办法,欢迎在下方留言呀!