java-顺序和乱序数组的二分搜索

来源:互联网 发布:怎样抢注域名 编辑:程序博客网 时间:2024/04/29 09:17

注意:需要将 bs-1.txt 和 bs-2.txt 放入 Java Project 文件夹下。


import java.io.*;import java.util.Scanner;class Number {int num;int index;}class binarySearch {public static void main(String[] args) throws IOException {binarySearch bin = new binarySearch();int array[] = bin.getNum(); // 将txt文件中的数据读入数组Number[] numArray = new Number[150]; // 定义结构体数组for (int i = 0; i < numArray.length; i++) {numArray[i] = new Number();numArray[i].index = i; // 为结构体数组中的每一个数分配索引numArray[i].num = array[i];}numArray = sort(numArray);Scanner in = new Scanner(System.in); // 从键盘中读入要查找的数System.out.println("请输入要查找的数:");int num = in.nextInt();int timeBegin = (int) System.currentTimeMillis();int order = bin.bin_Search(numArray, numArray.length, num);if (order != -1) {System.out.println(num + "在数列中的次序为:" + order);}int timeFinish = (int) System.currentTimeMillis();int time = timeFinish - timeBegin; // 计算算法用时System.out.println("查找用时:" + time + "毫秒");}int[] getNum() throws IOException { // 从txt文件中读取数据Scanner in = new Scanner(System.in);System.out.println("请选择要查找的数组:" + "\n" + "1、顺序数列" + "\n" + "2、乱序数列");int a = in.nextInt();BufferedReader reader;if (a == 1) {reader = new BufferedReader(new FileReader("bs-1.txt")); // 从字符输入流中读取文本} else {reader = new BufferedReader(new FileReader("bs-2.txt"));}int array[] = new int[200];String line; // 每行的字符String sumLine = ""; // 整个txt文件的字符while ((line = reader.readLine()) != null) { // 将每行的字符合并sumLine += line;}String[] num = sumLine.split("\\,"); // 以‘,’为分隔符,将文本分割为字符串reader.close();for (int i = 0; i < num.length; i++) { // 将字符串转为整形,保存在数组中array[i] = Integer.parseInt(num[i]);}return array;}int bin_Search(Number[] a, int array_size, int key) { // 以二分查找算法查找排好序的数组int low = 0, high = array_size - 1, mid;while (low <= high) {mid = (low + high) / 2;if (a[mid].num == key) {return a[mid].index + 1;} else if (a[mid].num < key) {low = mid + 1;} else {high = mid - 1;}}System.out.println("查询失败!");return -1;}static Number[] sort(Number[] a) {Number[] number = new Number[1];number[0] = new Number();for (int i = 0; i < a.length; i++) {for (int j = 1; j < a.length - i; j++) {if (a[j].num < a[j - 1].num) {number[0] = a[j];a[j] = a[j - 1];a[j - 1] = number[0];}}}return a;}}

0 0