public class Arraydemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {17,34,89,131,502,667};
System.out.println("arr.length="+arr.length);
printArray(arr);
System.out.println(getIndex_3(arr,11,0,arr.length-1));
}
public static void printArray(int[] arr) {
System.out.print("[");
for(int x=0; x<arr.length; x++){
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+"]");
}
}
/*
数组常见功能:查找
明确一:结果
有,返回所在的位置
明确二:未知数
有,要查找的元素值,容器
*/
public static int getIndex(int[] arr,int key) {
for(int x=0; x<arr.length; x++)
if(arr[x] == key)
return x;
return -1;//这句不能没有 因为已经定义了返回值类型int 上一句的return是被控制的 如果没有找到值 则没有返回 这不符合已定义的返回值类型int 所以要加一句
}
public static int getIndex_2(int[] arr,int key,int min,int max) {
/*
有序数组
首先 取arr.length+0/2 if(arr[mid]==key) return mid;
else
*/
int mid = (max + min) / 2;
while(arr[mid] != key && max > min){
if(arr[mid] > key){
max = mid-1;
mid = (min + max) / 2;
}
else{
min = mid+1;
mid = (min + max) / 2;
}
}
if(max < min)
return -1;
return mid;
}
// 可以发现mid=(min+max)/2做了两次 可以优化
// if(arr[mid]>key) max=mid-1;
// else min=mid+1;
// if(max<min) return -1;
// mid放到条件判断语句之后又是一个小小的优化
// mid=(min+max)/2; 见3
// 下方的4更清晰
public static int getIndex_4(int[] arr,int key,int min,int max){
while(min<=max){
int mid = (max + min)>>1;
if(arr[mid]>key) max=mid-1;
else if(arr[mid]<key) min=mid+1;
else return mid;
}
return -1;
}
public static int getIndex_3(int[] arr,int key,int min,int max){
int mid = (max + min)>>1;
while(arr[mid]!=key){
if(arr[mid]>key) max=mid-1;
else min=mid+1;
if(max<min) return -1;
mid=(min+max)/2;
}
return mid;
}
}
折半查找与优化
最新推荐文章于 2023-04-04 20:08:31 发布