黑马程序员技术交流社区

标题: 哪位 大神给我个思路?? [打印本页]

作者: 荣斌    时间: 2015-9-2 15:41
标题: 哪位 大神给我个思路??

有一个有序的数组,想要将一个元素插入到该数组中,
还要保证该数组是有序的。如何获取该元素在数组中的位置


作者: 丶不缺小哥范儿    时间: 2015-9-2 15:41
class chazhao
{
        public static void main(String[] args)
        {
                int[] arr = {3,2,1,5,4,2,9};
                int index = getIndex(arr,2);
                System.out.println("index="+index);
        }
                public static int getIndex(int[] arr,int key)
        {
                for(int x=0; x<arr.length; x++)
                {
                        if(arr[x]==key)
                                return x;
                }
                return -1;
        }


}
就是在上代码的数组中查找,你要找的元素,找到了你要告诉他在数组中的位置,假如要找的元素是2,遍历这个元素,如果找的元素和这个key相等,就是说找到了,那就输出这个数x,否则也就是没找到,输出-1.
作者: 董兴朋    时间: 2015-9-2 16:40
要是我的话,会用这个数从第一个数开始比较大小,当这个数比前面一个数大,比后面一个数小,那么它的位置就定了。不知道能不能帮你,希望有点帮助。
作者: pyy061    时间: 2015-9-2 16:41
有序的数组的话,定义两个数组a[],b[],数组b比数组a长度要多1,用来打印插入数据后的数组
先接收这个插入的数
用循环跟a[]数组的元素值进行比较
循环里写个if语句,当插入的数小于或者等于a[i]的时候,跳出,否则把a[i]的值赋值给b数组同样位置的元素
再把插入的数据放到b数组里,进行个冒泡排序就好了.
作者: a4903913    时间: 2015-9-2 17:25
//要在一个有序的数组中插入一个数,插入完成后保持数组的有序
public class ZheBan {
        public static void main(String[] args) {
                int[] arr = {1,3,5,8,10,15,46};
               
                System.out.println(getIndex(arr, 10));
        }
        /*
         * 折半排序
         */
        public static int getIndex(int[] arr,int key){
                int max = arr.length-1,min = 0,mid;
                while (min <= max) {
                        mid = (min + max) / 2;
                        if (key > arr[mid]) {
                                min = mid + 1;
                        }else if (key < arr[mid]) {
                                max = mid -1;
                        }else{
                                return mid;
                        }
                }
                return min;
        }
}

作者: a4903913    时间: 2015-9-2 17:30
看代码 不明白问我!!!!!!!
作者: 王海彬    时间: 2015-9-2 21:29
老毕的视频有讲啊在数组的折半排序中就有这个,你去看下就行了
作者: MilesMatheson    时间: 2015-9-2 22:01
你得说是整型数组呢还是字符型数组哈?要是我,我会存入数组,一个冒泡排序;想要找某个元素的话,直接遍历数组,看哪个元素跟指定元素相同就输出其角标;o了
作者: 残影    时间: 2015-9-2 22:50
毕老师第4天视频,折半查找里面有讲。
作者: lishuai881512    时间: 2015-9-2 23:11
我也看到过  看视频后自己多敲代码
作者: hhuxiaolang    时间: 2015-9-2 23:13
视频中就有讲解的,折半排序,获取的min值即是
作者: 儿时往事    时间: 2015-9-2 23:57
过来看看
作者: 15325501970    时间: 2015-9-3 00:32
火车上睡不着
作者: zhch1377    时间: 2015-9-3 08:40
这个我是真的不知道不知道
作者: 肖天长    时间: 2015-9-3 11:41
折半遍历数组,返回最小值就是要插入元素的位置
作者: Qf-nice    时间: 2015-9-3 17:23
折半查找,
作者: 球球_    时间: 2015-9-3 23:58
去看老毕的视频吧
作者: BlackHorse001    时间: 2015-9-4 11:27
/*练习插入一个数进一个数组,并保证数组有序*/
public class HalfSeach
{
        public static int halfSeach(int[] n,int key)
        {
                int min=0,max=n.length-1,mid;
                mid=(min+max)>>1;
                while(n[mid]!=key)
                {
                        if(key>n[mid])
                        min=mid+1;
                        else if(key<n[mid]) max=mid-1;
                        mid=(min+max)>>1;
                        while(min>max) return -1;
                } return mid;
        }
       
        public static int halfSeach2(int[] n,int key)
        {
                int min=0,max=n.length-1;
                int mid=(min+max)>>1;
                while(min<=max)
                {        if(key>n[mid]) min=mid+1;
                        else if(key<n[mid]) max=mid-1;
                        else return mid;    //这里的mid'包含数组只有一个数和插入的数和数组中的数相同的情况,这里就是插入的下标值;
                        mid=(min+max)>>1;     
                } return -1;               //这里将-1改为min值,就是插入数的下标值。
        }
        /*public static void inserNumber(int[] n,int inserNum)   java中数组不可扩容,要通过collection来做ArrayList.
        {       
                int min=0,max=n.length-1,mid;
                mid=(min+max)/2;
                while(min==max)
                {
                        if(inserNum>n[mid]) min=mid+1;
                        else if(inserNum<n[mid]) max=mid-1;
                       
                        mid=(min+max)>>1;
                        break;
                }int x=n.length+1;
                if(n[mid]>inserNum) {for(int i=x;i>mid;i--) {n[i]=n[i-1];n[mid]=inserNum;}}
                else if(n[mid]<=inserNum) {for(int i=n.length;i>mid+2;i--){n[i]=n[i-1];n[mid+1]=inserNum;}}
        }*/
        public static void printArray(int[] n)
        {        System.out.print("[");
                for(int i=0;i<n.length;i++)
                {        if(i!=n.length-1)
                        System.out.print(n[i]+", ");
                        else System.out.print(n[i]);
                } System.out.println("]");
        }
        public static void main(String[] args)
        {
                int[] n={1,3,4,5,7,9,12,23,45,67,90,123};       
                System.out.println(halfSeach2(n,23));
                System.out.println(halfSeach2(n,231));
                inserNumber(n,10);
                printArray(n);
               
        }
}
作者: heima_huang    时间: 2015-9-4 20:32
可以考虑二分法~节省时间,效率也高
作者: 姜群    时间: 2015-9-4 23:13
给数组排序你应该会吧,可以把他当做数组里面的元素进行排序啊,找到大于和小于他最接近的俩个值,取大于他那个数的索引值就可以了
作者: 我来了    时间: 2015-9-5 09:45
折半查找,然后把返回值改成min
作者: 327037419    时间: 2015-9-5 11:49
List lt = new LinkedList();

                List lt2 = new LinkedList();
//
                for (int j = 0; j <= 9; j++) {
                        lt.add("a" + j);
                }
                System.out.println(lt);

//                Collections.shuffle(lt);//随机排序
//               
//                System.out.println(lt);
//               
//                Collections.reverse(lt);//逆序
//                System.out.println(lt);
//                System.out.println(lt);
//                Collections.reverse(lt);//逆序
//                Collections.reverse(lt);//逆序
                Collections.sort(lt);
                System.out.println(lt);
                //必须滴排序后才能折半查找
                System.out.println(Collections.binarySearch(lt, "a0"));
               
               

大哥把分给我吧!
作者: 弄啥嘞。    时间: 2015-9-5 23:25
有序的数组
1,判断数组的长度.
2,通过折半查找找到位置.
3,插入数组,把后半数组依次后移(用for循环).
基本OK了.就是这个思路.
作者: 生存追求    时间: 2015-9-6 23:46
用indexOf()
作者: kitboxer    时间: 2015-9-7 20:22
你没好好看基础视频吧,毕老师讲数组时专门解决了这个问题
作者: Java_EE    时间: 2015-9-10 15:27
二分查找法
作者: 小王很忙    时间: 2015-9-11 10:13
我也来学习一下
作者: Surprise    时间: 2015-9-12 09:50
用二分查找,虽然找不到,但是最终的指向就是你要插入的位置,获取索引,在该索引插入要插入的数据即可!!!
作者: Surprise    时间: 2015-9-12 09:52
用二分查找查找该元素,(虽然查不到)获取最终索引,在该索引下插入要插入元素即可!!!
作者: Surprise    时间: 2015-9-12 09:55
用二分查找,获取(返回)查找的最终索引。在该索引下插入即可
作者: hello隔壁老李    时间: 2015-9-12 10:16
遍历有序数组和它比较,比他小的继续比较,比它大的停,插入这个数的后面。。。
或者看毕老师的视频,折半查找法
作者: a334    时间: 2015-9-14 20:24
这个简单,从第一个书开始比较找到一个合适的位置以后,将这个位置后面的数都往后移。不过这样实现数组长度要至少留一位给这个数。后面学到容器(Collection类)的话,会比较方便,用Iterator对象做迭代器,可以方便的实现对容器内元素的便利操作。其中的原理 有点类似于指针。

作者: 那风景如花    时间: 2015-9-15 22:04
插入排序
作者: 菊花爆满山    时间: 2015-9-15 22:45
此问题已解决
作者: gannenggufen    时间: 2015-9-17 20:42
排序,再二分查找可以吗?
作者: super_qilin    时间: 2015-9-18 09:32
最简单的方法就是遍历一遍数组,找到合适的位置,但是这样效率低,可以利用二分查找的方法,找到合适的位置
作者: 王贺明    时间: 2015-9-24 16:33
折半查找效率高
作者: Arron    时间: 2015-9-25 23:04
public class ZheBan {
        public static void main(String[] args) {
                int[] arr = {1,3,5,8,10,15,46};
               
                System.out.println(getIndex(arr, 10));
        }
        /*
         * 折半排序
         */
        public static int getIndex(int[] arr,int key){
                int max = arr.length-1,min = 0,mid;
                while (min <= max) {
                        mid = (min + max) / 2;
                        if (key > arr[mid]) {
                                min = mid + 1;
                        }else if (key < arr[mid]) {
                                max = mid -1;
                        }else{
                                return mid;
                        }
                }
                return min;
        }
}
作者: 丶不缺小哥范儿    时间: 2015-9-29 00:17
黑马币哟  ~亲




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2