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));
}
}
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));
}
}
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;
}}
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);
}}
这里要使用折半查找法,但是我就搞不清楚,为什么在后面对数组进行扩增之后,却没有将main函数中的给改变了
这里要使用折半查找法,但是我就搞不清楚,为什么在后面对数组进行扩增之后,却没有将main函数中的给改变了如果使用折半查找(二分查找),后面虽然找出来了插入数组的下标,但是没有变动数组啊,main函数里的当然没有改变
{
arr = Arrays.copyOf(arr, arr.length+1);//对数组进行扩充Java传值参数。你可以改变arr里的内容,不能改变arr本身。
你对你那个方法里面的arr就行赋值只是把它的引用指向了那个值,但这个arr只是这个方法里面的变量
和你主方法里面的变量一毛钱关系没得。所以你改了之后没得用。
你可以把对数组扩充着句写到main里面然后把改变之后的数组传到insert方法里面。
如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;
}
}
我觉得问题应该出现在copyOf这个方法里面,这个方法是不是又另外开辟了一个空间,然后把原来arr的元素给复制到了新的数组里面,然后造成了,main函数中的arr指向的是原来的空间,而insert函数中的arr则指向了新的空间。
那么就导致了,我之后的插入就插入了新的数组当中。求解,原理是不是这样的,为什么会是这样呢?能不能找到API中或者其它地方的资料作为依据呢?
我认为在传参的时候是将arr中数组的地址赋给insert中arr,因为如果我将它排序的话,那么原来main函数中arr中内容也会变成排序后的顺序!
我觉得问题应该出现在copyOf这个方法里面,这个方法是不是又另外开辟了一个空间,然后把原来arr的元素给复制到了新的数组里面,然后造成了,main函数中的arr指向的是原来的空间,而insert函数中的arr则指向了新的空间。
那么就导致了,我之后的插入就插入了新的数组当中。 求解,原理是不是这样的,为什么会是这样呢?能不能找到API中或者其它地方的资料作为依据呢?