本帖最后由 EYE_SEE_YOU 于 2013-9-21 18:56 编辑
class SelectArray {
public static void main(String[] args) {
int[] arr = {33,22,11,66,55,44}; //无序数组
//System.out.println(getIndex(arr,88));
int[] arr2 = {11,22,33,44,55,66,77};
System.out.println(getIndex3(arr2,88));
}
//无序的数组查找
public static int getIndex(int[] arr,int key) {
for (int x = 0;x < arr.length; x++ ) {
if (key == arr[x]) {
return x;
}
}
return -1;
}
//有序的数组二分查找
public static int getIndex2(int[] arr,int key) {
int min = 0; //定义变量记录最小角标值
int max = arr.length - 1; //定义变量记录最大角标值
int mid = (min + max) / 2; //求出中间角标值
while (key != arr[mid]) { //当查找的值不等于中间角标值,开始循环
if (key < arr[mid]) { //传入的值小于了中间角标值
max = mid - 1; //最大角标变化
}else if (key > arr[mid]) { //传入的值大于了中间角标值
min = mid + 1; //最小角标变化
}
mid = (min + max) / 2; //无论min还是max改变,中间角标值都要随之改变
if (min > max) { //当最小角标值大于了最大角标值,就没有折半的可能了,返回-1
return -1;
}
}
return mid;
}
//二分查找法的第二种做法
public static int getIndex3(int[] arr,int key) {
int min = 0; //定义变量记录住最小的角标值
int max = arr.length - 1; //定义变量记录住最大角标值
while (min <= max) { //如果最小的角标值小于最大角标值就可以进行折半了
int mid = (min + max)/2; //求出中间角标值
if (key < arr[mid]) { //判断传入的值如果小于中间角标值
max = mid - 1; //最大角标值变化
}else if (key > arr[mid]) { //如果传入的值大于了中间角标值
min = mid + 1; //最小角标值变化
}else {
return mid;
}
}
return -1; //没有折半的可能直接返回-1
}
}
|
|