一、实验目的
1.理解分治算法的概念和基本要素;
2.理解递归的概念;
3.掌握设计有效算法的分治策略;
4.通过二分搜索技术学习分治策略设计技巧;
二、实验内容
实验内容:
1.使用二分搜索算法查找任意N个有序数列中的指定元素。
2.通过上机实验进行算法实现。
3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。
至少使用两种方法进行编程。
三、源程序
import java.util.Scanner;
public class BinarySearchTest {
public static int ExhaustiveSearch(int[] nums, int target) {
for (int i = 0; i < nums.length; ++i) {
if (nums[i] == target) {
return i;
}
}
return -1;
}
public static int binarySearchIteration(int[] nums, int target) {
int left = 0, right = nums.length-1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
return -1;
}
public static int binarySearchRecursion(int[] nums, int target, int left, int right) {
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
binarySearchRecursion(nums, target, left, right);
} else if (nums[mid] > target) {
right = mid - 1;
binarySearchRecursion(nums, target, left, right);
}
}
return -1;
}
public static void main(String[] args) {
int n, target, index;
Scanner in = new Scanner(System.in);
System.out.print("请输入整数数组的元素个数:");
n = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; ++i) {
System.out.print(i + "号元素的值为:");
nums[i] = in.nextInt();
}
do {
System.out.print("请输入要搜索的整数:");
target = in.nextInt();
index = ExhaustiveSearch(nums, target);
if (index == -1) {
System.out.println("抱歉,未查找到该数字");
} else {
System.out.println("本次使用穷举法\n" + target + "的索引为:" + index);
}
index = binarySearchIteration(nums, target);
if (index == -1) {
System.out.println("抱歉,未查找到该数字");
} else {
System.out.println("本次使用二分搜索(迭代)\n" + target + "的索引为:" + index);
}
index = binarySearchRecursion(nums, target, 0, nums.length-1);
if (index == -1) {
System.out.println("抱歉,未查找到该数字");
} else {
System.out.println("本次使用二分搜索(递归)\n" + target + "的索引为:" + index);
}
} while (true);
}
}
四、实验结果