import java.util.Arrays;class ArrayDemo4 {

static int[] arr = { 13, 15, 19, 28, 33, 45, 78, 106 };

public static void main(String[] args) {
int index = halfSearch(50); System.out.println(Arrays.toString(arr)); insert(index, 50); System.out.println(Arrays.toString(arr)); } public static int halfSearch(int key) {
int max, min, mid;
min = 0;
max = arr.length - 1; mid = 0; while (min <= max) {
mid = (max + min) >> 1;// 相当于除2 if (key < arr[mid])
max = mid - 1;
else if (key > arr[mid])
min = mid + 1;
else
return mid;
} return min;
} public static void insert(int index, int num) {

arr = Arrays.copyOf(arr, arr.length + 1);// 对数组进行扩充 for (int i = arr.length - 1; i > index; i--) {

arr[i] = arr[i - 1];

} arr[index] = num; System.out.println(Arrays.toString(arr));
}
}

解决方案 »

  1.   

    亲  有你那么麻烦吗?public class Test { public static void main(String[] args) {

    int[] arr = {13, 15, 19, 28, 33, 45, 78, 106};
    int index=search(arr,14);
    System.out.println(index);
    }

    public static int search(int[] arr,int a)
    {
    for(int i=0;i<arr.length;i++)
    {
    int index=0;
    if(arr[i]>a)
    {
    index=i;
    return index;
    }


    }

    return arr.length;
    }}
      

  2.   

    或者更简易的:
    import java.util.Arrays;
    public class Test2 { public static void main(String[] args) {

    int[] arr = {13, 15, 19, 28, 33, 45, 78, 106};

    int  s=Arrays.binarySearch(arr, 50);

    int index=0-s-1;
    System.out.println(index);

    }}
      

  3.   


    这里要使用折半查找法,但是我就搞不清楚,为什么在后面对数组进行扩增之后,却没有将main函数中的给改变了
      

  4.   


    这里要使用折半查找法,但是我就搞不清楚,为什么在后面对数组进行扩增之后,却没有将main函数中的给改变了如果使用折半查找(二分查找),后面虽然找出来了插入数组的下标,但是没有变动数组啊,main函数里的当然没有改变
      

  5.   

    如果使用折半查找的话,直接就用Arrays类的折半查找的方法,自己写的话也可以,但是别人已经封装好了,直接用比较方面。
      

  6.   

    public static void insert(int[] arr, int index, int num)
    {
    arr = Arrays.copyOf(arr, arr.length+1);//对数组进行扩充Java传值参数。你可以改变arr里的内容,不能改变arr本身。
      

  7.   

    你们真是都没搞清楚别人问的什么,人家是问用这个方法之后为什么原来的数组没有改变,就是9楼说的,
    你对你那个方法里面的arr就行赋值只是把它的引用指向了那个值,但这个arr只是这个方法里面的变量
    和你主方法里面的变量一毛钱关系没得。所以你改了之后没得用。
    你可以把对数组扩充着句写到main里面然后把改变之后的数组传到insert方法里面。
      

  8.   


    如9L所说,insert方法只能改变参数arr的内容,但不能改变main arr的内容。所以该函数需要返回值。顺便加上了二分查找法
    package com.zyc.csdn.answer;import java.util.Arrays;/*
     面试题:
     给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,
     那么这个元素的存储的角标该如何获取。
     */
    public class Test002 {
    public static void main(String[] args) {
    int[] arr = { 13, 15, 19, 28, 33, 45, 78, 106 };
    int index = halfSearch(arr, 50);
    System.out.println("index=" + index);
    arr = insert(arr, index, 50);
    System.out.println(Arrays.toString(arr)); } static int halfSearch(int[] arr, int num) {
    return halfSearch(arr, num, 0, arr.length - 1);
    } static int halfSearch(int[] arr, int num, int low, int high) {
    if (low > high) {
    return low;
    }
    int mid = (low + high) / 2;
    if (arr[mid] > num) {
    return halfSearch(arr, num, low, mid - 1);
    } else if (arr[mid] < num) {
    return halfSearch(arr, num, mid + 1, high);
    } else {
    return mid;
    }
    } static int[] insert(int[] arr, int index, int num) {
    arr = Arrays.copyOf(arr, arr.length + 1);
    for(int i = arr.length - 1;i > index;--i) {
    int temp = arr[i];
    arr[i] = arr[i - 1];
    arr[i - 1] = temp;
    }
    arr[index] = num;
    return arr;
    }
    }
      

  9.   

    我认为在传参的时候是将arr中数组的地址赋给insert中arr,因为如果我将它排序的话,那么原来main函数中arr中内容也会变成排序后的顺序!
    我觉得问题应该出现在copyOf这个方法里面,这个方法是不是又另外开辟了一个空间,然后把原来arr的元素给复制到了新的数组里面,然后造成了,main函数中的arr指向的是原来的空间,而insert函数中的arr则指向了新的空间。
    那么就导致了,我之后的插入就插入了新的数组当中。求解,原理是不是这样的,为什么会是这样呢?能不能找到API中或者其它地方的资料作为依据呢?
      

  10.   


    我认为在传参的时候是将arr中数组的地址赋给insert中arr,因为如果我将它排序的话,那么原来main函数中arr中内容也会变成排序后的顺序!
     我觉得问题应该出现在copyOf这个方法里面,这个方法是不是又另外开辟了一个空间,然后把原来arr的元素给复制到了新的数组里面,然后造成了,main函数中的arr指向的是原来的空间,而insert函数中的arr则指向了新的空间。
     那么就导致了,我之后的插入就插入了新的数组当中。 求解,原理是不是这样的,为什么会是这样呢?能不能找到API中或者其它地方的资料作为依据呢?