//折半查找实现
class BinarySearch
{
public static void main(String[] args)
{
int[] arr = {6,9,12,26,55,67,69,80};
sop(arr);
int index = btseatch(arr,12);
System.out.println("index = "+index);
}
public static void sop(int[] arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.println("arr["+i+"] ="+ arr[i]);
}
}
public static int btseatch(int[] arr,int key)
{
int min = 0;
int max = arr.length-1;
int mid = (min + max)/2;
while(key != arr[mid])//待查元素与arr[mid]比较,进而确定下一步查找范围。
{
if(key<arr[mid]) //于arr[mid]左侧范围内查找。
max = mid - 1;
else
min = mid + 1; //于arr[mid]右侧范围内查找。
if(max < min) //说明不存在待查元素。
return -1;
mid = (min + max)/2; //不能忘记,在获得新的min和max之后要重新计算出新的mid。
}
return mid;
}
}
当然,上述代码在折半查找方法中while的判断条件是依据:待查元素key和arr[mid]值得关系。即,key和arr[mid]不相等时就一直循环下去,直到两者相等,返回角标mid。或者出现角标max<min的情况,返回-1(即,没找到待查元素,查找失败。)
鉴于角标max<min。我们不妨利用角标max和min的关系来作为while的判断依据。代码如下:
public static int btseatch(int[] arr,int key)
{
int min = 0;
int max = arr.length-1;
//int mid = (min + max)>>1;
while(min <= max)
{
int mid = (min + max)>>1;//位运算>>,<<.左移乘,右移除。
if(key < arr[mid])
max = mid - 1;
else if(key > arr[mid])
min = mid + 1;
else
return mid;
}
return -1;
}
注意:折半查找一定是针对有序数组,无序数组不行。千万不要拿个无序数组,自己先排序,使之成为有序数组,然后再折半查找,这是不行的。因为在你自行排序的时候数组的角标已经发生了变化,所以后续的查找是无意义的。针对无序数组,查找某个元素可以直接查找,实现如下:
public static int getIndex(int[] arr,int key)
{
for(int i=0;i<arr.length;i++)
{
if(key==arr[i])
return i;
}
return -1;
}
锤炼·精技术_JeremyDC关于这个折半查找的一个应用。
【需求:在一个有序数组中插入一个元素,使得新数组还是一个有序数组。】
import java.util.*;
class BinarySearch
{
public static void main(String[] args)
{
int[] arr = {6,9,12,26,55,67,69,80};
sop(arr);
int index = btseatch(arr,800);
System.out.println("index = "+index);
int index1 = Arrays.binarySearch(arr,800);//Java再带功能。如果元素存在则返回具体角标位置,如果元素不存在则返回:-插入点-1.
System.out.println("index1 = "+ index1);
}
public static void sop(int[] arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.println("arr["+i+"] ="+ arr[i]);
}
}
public static int btseatch(int[] arr,int key)
{
int min = 0;
int max = arr.length-1;
//int mid = (min + max)>>1;
while(min <= max)
{
int mid = (min + max)>>1;
if(key < arr[mid])
max = mid - 1;
else if(key > arr[mid])
min = mid + 1;
else
return mid;
}
return min;//此处 出现返回min的意思就是待查元素不在该数组中,因为出现了max<min的情况。
} //注意:此处不再是return -1 了;另外为了达到和Java自身带有的功能一致此处实际返回值因该是:-min-1
}
上述实现重点在于插入点的问题。但是针对【需求:在一个有序数组中插入一个元素,使得新数组还是一个有序数组。】而言,具体讲新元素如何插入,如何将新数组打印出来,以后我再来补充……
锤炼·精技术_JeremyDc