三种Java数据查找算法:顺序查找,二分查找(递归方式)和二分查找(非递归方式)。内容来源网络资料整理,记录一下。
1、顺序查找
/**
* 说明:顺序查找,查询数组或集合不需要有序
* 顺序查找适合于存储结构为顺序存储或链接存储的线性表。
* 在s[0] - s[n-1]中顺序查找关键字为key的记录
* 查找成功时返回该记录的下标序号;
* 失败时返回-1
*
* @param s 需要查询的数组
* @param key 查询的字段值
* @return 返回值
*/
int SequentialSearch(int s[], int key) {
int i;
i = 0;
int length = s.length;
while (i < length && s[i] != key) i++;
if (s[i] == key) return i;
else return -1;
}
2、 二分查找,递归方式实现
/**
* 说明:二分查找,递归方式实现,建立在有序数组基础上的
* 在arr[]中顺序查找关键字为key的记录
* 查找成功时返回该记录的下标序号;
* 失败时返回-1
*
* @param arr 需要查询的数组
* @param low 查询下标
* @param high 查询上标
* @param key 查询字段
* @return 返回值
*/
int BinarySearchRecursion(int arr[], int low, int high, int key) {
if (low <= high) {
int mid = (low + high) / 2;
if (key == arr[mid])
return mid;
else if (key < arr[mid])
//移动low和high
return BinarySearchRecursion(arr, low, mid - 1, key);
else if (key > arr[mid])
return BinarySearchRecursion(arr, mid + 1, high, key);
}
return -1;
}
3、二分查找,非递归方式显示
/** * 说明:二分查找,非递归实现,建立在有序数组基础上的 * 在arr[]中顺序查找关键字为key的记录 * 查找成功时返回该记录的下标序号; * 失败时返回-1 * * @param arr 需要查询的数组 * @param key 查询字段 * @return 返回值 */ int binarySearch(int[] arr, int key) { int low = 0; int high = arr.length - 1; while (low <= high) { //中间位置计算,low+ 最高位置减去最低位置,右移一位,相当于除2.也可以用(high+low)/2 int middle = low + ((high - low) >> 1); //与最中间的数字进行判断,是否相等,相等的话就返回对应的数组下标. if (key == arr[middle]) { return middle; //如果小于的话则移动最高层的"指针" } else if (key < arr[middle]) { high = middle - 1; //移动最低的"指针" } else { low = middle + 1; } } return -1; }