折半查找(二分查找)的递归和非递归算法


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"));
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值