本帖最后由 贺靖轩 于 2013-4-1 11:23 编辑
黑马程序员_毕向东_Java基础视频教程第04天-07-数组(折半查找).avi
毕老爷这节视频给大家讲了折半查找 提到了折半查找的二种实现方式
还进到使用此方式的前提:有序
但是忽略了另一个方面:无重
代码:
public class SearchTest
{
public static void main(String[] args)
{
int[] arr=new int[]{1,2,2,2,2,2,3};
int index=getIndex(arr,2);
System.out.println(index);
}
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(max+min)>>1;
while(key!=arr[mid])
{
if(key>arr[mid])
{
min=mid+1;
}
else if(key<arr[mid])
{
max=mid-1;
}
if(min>max)
{
return -1;
}
mid=(max+min)>>1;
}
return mid;
}
public static int halfSearch_2(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(max+min)>>1;
while(min<=max)
{
mid=(max+min)>>1;
if(key>arr[mid])
{
min=mid+1;
}
else if(key<arr[mid])
{
max=mid-1;
}
else
{
return mid;
}
}
return -1;
}
public static int getIndex(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(max+min)>>1;
while(min<=max)
{
mid=(max+min)>>1;
if(key>arr[mid])
{
min=mid+1;
}
else if(key<arr[mid])
{
max=mid-1;
}
else
{
return mid;
}
}
return min;
}
}
结果:
2 //为查找元素的下标
如果数组中有重复元素,虽然找到了该元素的下标(位于中间的元素) 但却忽略了数组中该元素的个数。
如果数组中只有一个重复元素:
一个省事的方法就是:
借助 TreeSet 可以计算出该元素的个数 至于其位置 可以通过相应推理获得。
Set<Integer> set=new TreeSet<Integer>();
for(int i:arr)
{
set.add(i);
}
System.Out.Println(set.size());
int numOfKey=set.size()-arr.size();
如果存在多个元素,恩,重复的,大家想办法吧。
我脸皮厚,说我抠的随便喷,哈哈。
|