1、查找类
package com.zhanlang.find;
import java.util.Comparator;
import java.util.List;
public class UpdatedBinarySearch<T>
{
/**
* 使用while执行二分查找
*/
public int searchWithWhile(List<T> list, T key, Comparator<T> comparator)
{
int minIndex = 0;
int maxIndex = list.size()-1;
while(minIndex <= maxIndex)
{
int midIndex = (minIndex + maxIndex)/2;
T midValue = list.get(midIndex);
if(comparator.compare(key, midValue) == 0)
{
return midIndex;
}else if(comparator.compare(key, midValue) < 0)
{
maxIndex = midIndex -1;
}else
{
minIndex = midIndex + 1;
}
}
return -1;
}
/**
* 使用递归执行二分查找
*/
public int searchWithRecursion(List<T> list, T key, int minIndex, int maxIndex, Comparator<T> comparator)
{
int midIndex = (minIndex + maxIndex)/2;
T midValue = list.get(midIndex);
/**
* 如果要查找的关键字小于最小值,或大于最大值,或者minIndex > maxIndex时,说明没有找到
* 这里的minIndex不要写死成0,maxIndex也不要写死成list.size()-1;因为随着递归,他们都是变化的
*/
if(comparator.compare(key, list.get(minIndex)) < 0 || comparator.compare(key, list.get(maxIndex)) > 0 || minIndex > maxIndex)
{
return -1;
}
if(comparator.compare(key, midValue) < 0)
{
maxIndex = midIndex - 1;
return searchWithRecursion(list, key, minIndex, maxIndex, comparator);
}else if(comparator.compare(key, midValue) > 0)
{
minIndex = midIndex + 1;
return searchWithRecursion(list, key, minIndex, maxIndex, comparator);
}else
{
return midIndex;
}
}
}
2、比较类
package com.zhanlang.util;
import java.util.Comparator;
public class IntegerComparator implements Comparator<Integer>
{
/**
* num1 < num2时,返回-1,num1 > num2时,返回1,相等时返回0
*/
@Override
public int compare(Integer num1, Integer num2)
{
if(num1 < num2)
{
return -1;
}
else if(num1 > num2)
{
return 1;
}else
{
return 0;
}
}
}
3、测试类
package com.zhanlang.find;
import java.util.ArrayList;
import java.util.List;
import com.zhanlang.util.IntegerComparator;
import junit.framework.TestCase;
public class TestApp extends TestCase
{
public void test1()
{
UpdatedBinarySearch<Integer> bSearch = new UpdatedBinarySearch<Integer>();
IntegerComparator comparator = new IntegerComparator();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(9);
list.add(12);
list.add(23);
list.add(34);
list.add(56);
list.add(76);
list.add(89);
list.add(123);
list.add(165);
int key = 165;
int index = bSearch.searchWithWhile(list, key, comparator);
assertEquals(10, index);
}
public void test2()
{
UpdatedBinarySearch<Integer> bSearch = new UpdatedBinarySearch<Integer>();
IntegerComparator comparator = new IntegerComparator();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(9);
list.add(12);
list.add(23);
list.add(34);
list.add(56);
list.add(76);
list.add(89);
list.add(123);
list.add(165);
int key = 1;
int index = bSearch.searchWithWhile(list, key, comparator);
assertEquals(0, index);
}
public void test3()
{
UpdatedBinarySearch<Integer> bSearch = new UpdatedBinarySearch<Integer>();
IntegerComparator comparator = new IntegerComparator();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(9);
list.add(12);
list.add(23);
list.add(34);
list.add(56);
list.add(76);
list.add(89);
list.add(123);
list.add(165);
int key = 123;
int index = bSearch.searchWithWhile(list, key, comparator);
assertEquals(9, index);
}
public void test4()
{
UpdatedBinarySearch<Integer> bSearch = new UpdatedBinarySearch<Integer>();
IntegerComparator comparator = new IntegerComparator();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(9);
list.add(12);
list.add(23);
list.add(34);
list.add(56);
list.add(76);
list.add(89);
list.add(123);
list.add(165);
int key = 999;
int index = bSearch.searchWithWhile(list, key, comparator);
assertEquals(-1, index);
}
}