本帖最后由 张明 于 2012-8-19 05:14 编辑
先简要说明一下,基础视频第四天-7-数组(折半查找)
视频最后老师提出一个练习,在一个有序的数组中,插入一个数后,仍然保持数组有序性
老师的代码,只是通过折半查找实现了要插入的数插入在什么地方,这个大家都可以完成
问题所在,我要完整输出,怎么办?- class charu
- {
- public static void main(String[] args)
- {
- int[] arr={0,1,2,3,5,6,7,8,0};//为简化,有效数字8以后手动给0
- int flag=0;
- for(int x=7;x>=0;x--)//为了说明问题,要有序插入4,手动赋值给x=7
- {
- if(arr[x]>4)//这个地方写>=也可以,>=就是把4插入到原数组4(若有)的前面
- arr[x+1]=arr[x];
- else
- {
- arr[x+1]=4;
- flag=1;
- }
- if(flag==1)//标记成功插入,避免0123被覆盖
- break;
- }
- for (int x=0;x<arr.length;x++ )
- {
- System.out.print(arr[x]);
- }
- }
- }
复制代码 (我服了啊,发了N次贴了,为什么我发代码就是没有格式呢,这个也求解)
运行结果,4已经成功插入正确地方
那么,在我代码的注释的地方,问题就来了
1.要插入一个数,数组必然要增大1,比插入数大的数为了保持有序性必须依次后移一位,老师没有写出来
2.我是手动给数组多加了一位0,在实际中就像视频中老师那样直接int[] arr={.....},后移怎么解决?数组下标会越位报错的,这是最大的疑问,老师好像没有考虑到,下面详解
3.如果说有人直接定义int[] arr=new int[100]等,多定义一些元素不就可以了吗?那么请你想一想,我若有效元素只有0,1那么在数组中就是{0,1,0,0,0,0,.........},还是要插入4,你怎么办?那不就是arr[99]=4了吗。arr.length这个值绝对等于100,这就是最大的缺陷,无法获取有效元素的真实长度
4.如果你还说从数组中第100个元素往前判断为0的元素忽略掉,那么,极端的情况就是有效元素是一个或多个0,{0,0,0,0,0......},还是插入4,怎么办?说我太极端挑刺?那有负数和0在一起呢?{-2,1,0,0,0......}
只要有能在数组定义时定义比输入有效数据至少多一个元素,以上完美解决,但我真的不知道怎么定义
|
|