修改折半查找使之能进行范围查找。

修改折半查找使之能进行范围查找。所谓范围查找是要找出在给定值a和b之间的所有元素(a<=b)。

思路:
折半循环查找的最终目的是使 a<=arr[mid]<=b,然后通过for循环输出满足条件的值。

public static void slove(int[] arr,int a,int b) {
		Arrays.sort(arr);
		System.out.println("排序后的数组:");
		for(int k : arr) {
			System.out.print(k+" ");
		}
		System.out.println();
		
		System.out.println("===========\n待查区间:["+a+","+b+"]");
		
		// 查找
		int mid = 0;
		int low = 0;
		int high = arr.length - 1;
		while(low <= high) {
			mid = (low+high)/2;
			if(arr[mid] < a) {				// arr[mid]不在[a,b]中,继续移动low指针
				low = mid + 1;			
			}else if(arr[mid] > b) {		// arr[mid]不在[a,b]中,继续移动high指针
				high = mid - 1;
			}else {							// arr[mid]在[a,b]中,通过遍历判断取[a,b]中的值
				System.out.println("===========\n最终结果:");
				for (int i = low; i<=mid; i++) {
					if (arr[i]>=a) {
						System.out.print(arr[i]+" ");
					}
				}
				for(int i=mid+1; arr[i]<=b; i++) {
					System.out.print(arr[i]+" ");
				}
				return ;					// 跳出
			}
		}
	}
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
折半查找(也称二分查找)是一种在有序数组查找特定元素的算法。对于需要进行范围查找的情况,我们可以在折半查找的基础上进行一些修改,具体步骤如下: 1. 找到范围内的间元素 mid,计算其下标 mid_index。 2. 将要查找的元素与间元素进行比较,若相等则直接返回 mid_index。 3. 若要查找的元素小于间元素,则在左半部分继续查找,即在下标为 start 到 mid_index-1 的范围进行折半查找。 4. 若要查找的元素大于间元素,则在右半部分继续查找,即在下标为 mid_index+1 到 end 的范围进行折半查找。 5. 重复步骤1-4,直到找到要查找的元素或者范围缩小到只有一个元素。 下面是使用C语言描述的代码实现: ```c int binary_search_range(int arr[], int start, int end, int target) { while (start <= end) { int mid_index = start + (end - start) / 2; int mid = arr[mid_index]; if (mid == target) { return mid_index; } else if (target < mid) { end = mid_index - 1; } else { start = mid_index + 1; } } return -1; //未找到 } int binary_search_range_left(int arr[], int start, int end, int target) { while (start <= end) { int mid_index = start + (end - start) / 2; int mid = arr[mid_index]; if (mid >= target) { end = mid_index - 1; } else { start = mid_index + 1; } } return start; } int binary_search_range_right(int arr[], int start, int end, int target) { while (start <= end) { int mid_index = start + (end - start) / 2; int mid = arr[mid_index]; if (mid <= target) { start = mid_index + 1; } else { end = mid_index - 1; } } return end; } ``` 其,`binary_search_range` 函数是基本的折半查找函数,输入参数为要查找有序数组 `arr`,查找范围的起始下标 `start` 和终止下标 `end`,以及要查找的元素 `target`,返回其下标。若未找到,则返回 -1。 `binary_search_range_left` 函数则是用来查找左边界的函数,输入参数和返回值与 `binary_search_range` 相同,返回的是第一个大于或等于 `target` 的元素的下标。若所有元素都小于 `target`,则返回 `end+1`。 `binary_search_range_right` 函数则是用来查找右边界的函数,输入参数和返回值与 `binary_search_range_left` 相同,返回的是最后一个小于或等于 `target` 的元素的下标。若所有元素都大于 `target`,则返回 `start-1`。 使用这两个函数,我们就可以方便地进行范围查找了。例如,要查找有序数组 `arr` 所有值在区间 [left, right] 内的元素,可以使用以下代码: ```c int left_index = binary_search_range_left(arr, 0, n-1, left); int right_index = binary_search_range_right(arr, 0, n-1, right); for (int i = left_index; i <= right_index; i++) { //处理元素 arr[i] } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值