ひんと:
Java
1import java.util.List;
2import java.util.Comparator;
3
4public class BinarySearch {
5
6 // java.util.Arrays.binarySearch とコンパチな二分探索
7 // a は c に基づいてソートされていること。
8 static <T> int binarySearch(List<T> a, T key, Comparator<T> c) {
9 int first = 0;
10 int count = a.size();
11
12 while ( count > 0 ) {
13 int count2 = count / 2;
14 int mid = first + count2;
15 if ( c.compare(a.get(mid),key) < 0 ) { // midより後半にあるハズ...
16 first = mid + 1;
17 count -= count2 + 1;
18 } else if ( c.compare(a.get(mid),key) > 0 ) { // midより前半にあるハズ...
19 count = count2;
20 } else {
21 return mid;
22 }
23 }
24 return -first - 1;
25 }
26
27 // おためし
28 public static void main(String[] args) {
29
30 List<String> data = new java.util.ArrayList<String>();
31 data.add("grape"); data.add("peach");
32 data.add("banana"); data.add("cherry");
33 data.sort((x, y)->{return x.compareTo(y);});
34 for ( String item : data ) {
35 System.out.printf("%s ", item);
36 }
37 System.out.println("\n----");
38
39 String[] targets = new String[] { "apple", "grape", "melon", "strawberry" };
40
41 for ( String target : targets ) {
42 int result = binarySearch(data, target, (x, y)->{return x.compareTo(y);});
43 if ( result >= 0 ) {
44 System.out.printf("%s found at %d\n", target, result);
45 } else {
46 System.out.printf("%s NOT found. insertion point : %d\n", target, -result-1);
47 }
48 }
49
50 }
51}