【java查找算法】

java查找算法

使用java实现查找的常用算法:

1.线性遍历查找

public static void main(String[]args){
    //创建数组
	int[] array = {1, 4, 8, 5, 9};
	//所需要查找的元素
	int obj= 8;     
	boolean isFlag = true;
  
    //遍历数组,查找所需元素,找到后返回其下标
	for(int i= 0; i<array.length; i++){
		if(obj==(array[i])){               
			System.out.println("找到指定元素,位置为"+ i);
			isFlag = false;
			break;
		}
	}
	if(isFlag){
		System.out.println("未找到元素");
	}
}

2.二分法查找

/*
二分法查找针对的是排序好的数据集合来进行排序的,在这个例子中,我们定义了一个名为binarySearch()的静态方法,该方法接受一个整数数组和一个目标整数作为参数。我们首先定义了两个指针left和right,它们分别指向数组的第一个和最后一个元素。然后,我们使用一个while循环来不断缩小搜索范围,直到找到目标元素或搜索范围为空。

在每次循环中,我们首先计算出中间元素的索引mid。如果中间元素等于目标元素,我们就返回中间元素的索引。如果中间元素小于目标元素,我们就将左指针移动到中间元素的右侧。如果中间元素大于目标元素,我们就将右指针移动到中间元素的左侧。

如果我们在循环结束时仍然没有找到目标元素,我们就返回-1表示未找到。
*/
public static int binarySearch(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;
	
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

3.插值查找

/*
插值查找也是针对已经排序好的数据集合,是一种基于二分查找的算法,它假设元素在数组中均匀分布。以下是一个Java实现的示例代码:在这个例子中,我们定义了一个名为interpolationSearch()的静态方法,该方法接受一个整数数组和一个目标整数作为参数。我们首先定义了两个指针left和right,它们分别指向数组的第一个和最后一个元素。然后,我们使用一个while循环来不断缩小搜索范围,直到找到目标元素或搜索范围为空。

在每次循环中,我们首先计算出目标元素在当前搜索范围内的大致位置pos。我们使用插值公式(target - arr[left]) / (arr[right] - arr[left])来计算目标元素在当前搜索范围内的相对位置,然后将其乘以搜索范围的大小(right - left),最后加上左指针的位置left,得到目标元素的大致位置pos。

如果目标元素等于arr[pos],我们就返回pos。如果目标元素小于arr[pos],我们就将右指针移动到pos的左侧。如果目标元素大于arr[pos],我们就将左指针移动到pos的右侧。

如果我们在循环结束时仍然没有找到目标元素,我们就返回-1表示未找到。
*/
public static int interpolationSearch(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;

    while (left <= right && target >= arr[left] && target <= arr[right]) {
        int pos = left + ((target - arr[left]) * (right - left)) / (arr[right] - arr[left]);

        if (arr[pos] == target) {
            return pos;
        } else if (arr[pos] < target) {
            left = pos + 1;
        } else {
            right = pos - 1;
        }
    }

    return -1;
}

4.斐波那契查找

/*
你想要使用Java实现斐波那契查找。斐波那契查找是一种基于二分查找的算法,它使用斐波那契数列来确定搜索范围的大小。

我们定义了一个名为fibonacciSearch()的静态方法,该方法接受一个整数数组和一个目标整数作为参数。我们首先计算出斐波那契数列中最接近数组大小的数fib,以及斐波那契数列中的前两个数fib1和fib2。

然后,我们使用一个while循环来不断缩小搜索范围,直到找到目标元素或搜索范围为空。在每次循环中,我们首先计算出当前搜索范围的右端点i,它等于offset + fib2或n - 1中的较小值。然后,我们根据arr[i]与target的大小关系来更新斐波那契数列和搜索范围的大小。

如果目标元素等于arr[i],我们就返回i。如果目标元素小于arr[i],我们就将斐波那契数列和搜索范围的大小更新为左半部分。如果目标元素大于arr[i],我们就将斐波那契数列和搜索范围的大小更新为右半部分。

如果我们在循环结束时仍然没有找到目标元素,我们就返回-1表示未找到。需要注意的是,当fib1等于1且arr[offset + 1]等于目标元素时,我们需要返回offset + 1。
*/
public static int fibonacciSearch(int[] arr, int target) {
    int n = arr.length;
    int fib2 = 0;
    int fib1 = 1;
    int fib = fib2 + fib1;

    while (fib < n) {
        fib2 = fib1;
        fib1 = fib;
        fib = fib2 + fib1;
    }

    int offset = -1;

    while (fib > 1) {
        int i = Math.min(offset + fib2, n - 1);

        if (arr[i] < target) {
            fib = fib1;
            fib1 = fib2;
            fib2 = fib - fib1;
            offset = i;
        } else if (arr[i] > target) {
            fib = fib2;
            fib1 = fib1 - fib2;
            fib2 = fib - fib1;
        } else {
            return i;
        }
    }

    if (fib1 == 1 && arr[offset + 1] == target) {
        return offset + 1;
    }

    return -1;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值