- 顺序结构
- 有序
package search;
public class BinSearch<T extends Comparable< ? super T > > {
public int binSearch(T a[] , T value) {
if(a.length == 0)
return -1;
int low = 0;
int high = a.length - 1;
int mid = -1;
while(low <= high) {
mid = ( low + high ) / 2;
if(a[mid].compareTo(value) < 0)
low = mid + 1;
else if(a[mid].compareTo(value) > 0)
high = mid - 1;
else
return mid;
}
return -1;
}
public static void main(String[] args) {
Integer a[] = {1,2,6,9,11};
BinSearch<Integer> bs = new BinSearch<>();
int index = bs.binSearch(a, 11);
System.out.println(index);
}
}
已知一个从小到大排列的有序整型数组,从中找出某个数的出现次数
为了求出value在数组中出现的次数,可以利用二分查找算法找出value在数组中第一次出现的位置low和最后一次出现的位置high,high - low + 1则为value出现的次数。
问题转变为如何求出low和high,只要改动一下二分查找算法即可,具体做法是:
- 找到value之后不立刻返回,而是向左或向右继续查找;
- 获取low,在本次查找到的value的左序列中继续查找value;
- 获取high,在本次查找到的value的右序列中继续查找value;
package search;
public class BinSearchApplication<T extends Comparable<? super T>> {
public int binSearch(T a[] , T value , boolean islow) {
if(a.length == 0)
return -1;
int low = 0;
int high = a.length - 1;
int mid = -1;
int last = -1;
while(low <= high) {
mid = ( low + high ) / 2;
if(a[mid].compareTo(value) < 0)
low = mid + 1;
else if(a[mid].compareTo(value) > 0)
high = mid - 1;
else {
last = mid;
if(islow)
high = mid - 1 ;
else
low = mid + 1;
}
}
return last;
}
public int getDataCount(T a[] , T value) {
int low = binSearch(a, value, true);
int high = binSearch(a, value, false);
if(low == -1 || high == -1 )
return 0;
return high - low + 1;
}
public static void main(String[] args) {
BinSearchApplication<Integer> bsa = new BinSearchApplication<>();
Integer a[] = {1,1,2,3,4,5,5,5,6,6,8};
Set<Integer> set = new HashSet<Integer>();
for(int i = 0 ; i < a.length ; i ++)
set.add(a[i]);
for(int l : set) {
int count = bsa.getDataCount(a, l);
System.out.println("有序数组a[]中" + l+ "出现的次数:" + count);
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容