减半查找(二分查找)的递归和非递归算法
折半查找(二分查找)的递归和非递归算法
package com.my.test; /** * 折半查找(二分查找)的递归和非递归算法. 说明: * 1、要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integer、String等. * 2、非递归查找使用search();,递归查找使用searchRecursively(); **/ public class BinarySearch<T extends Comparable<T>> { private T[] data;// 要排序的数据 public BinarySearch(T[] data) { this.data = data; } public int search(T key) { int low; int high; int mid; if (data == null) { return -1; } low = 0; high = data.length - 1; while (low <= high) { mid = (low + high) / 2; //System.out.println("mid " + mid + " mid value:" + data[mid]); if (key.compareTo(data[mid]) < 0) { high = mid - 1; } else if (key.compareTo(data[mid]) > 0) { low = mid + 1; } else if (key.compareTo(data[mid]) == 0) { return mid; } } return -1; } private int doSearchRecursively(int low, int high, T key) { int mid; int result; if (low <= high) { mid = (low + high) / 2; result = key.compareTo(data[mid]); //System.out.println("mid " + mid + " mid value:" + data[mid]); if (result < 0) { return doSearchRecursively(low, mid - 1, key); } else if (result > 0) { return doSearchRecursively(mid + 1, high, key); } else if (result == 0) { return mid; } } return -1; } public int searchRecursively(T key) { if (data == null) { return -1; } return doSearchRecursively(0, data.length - 1, key); } public static void main(String[] args) { Integer[] data = { 1, 4, 5, 8, 15, 33, 48, 77, 96 }; BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data); System.out.println("Key index:" + binSearch.search(33)); System.out.println("Key index:" + binSearch.searchRecursively(3)); String[] dataStr = { "A", "C", "F", "J", "L", "N", "T" }; BinarySearch<String> binSearch1 = new BinarySearch<String>(dataStr); System.out.println("Key index:" + binSearch1.search("T")); } }