二分法检索(控制台输入一组数,找出关键字和最大值)

  算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。时间复杂度为:O(log2n)。(来自:百度百科)
查找数组中的关键字
package learning;

import java.util.Arrays;
/**
 * 二分法查找
 * @author Lee
 *
 */
public class TestTwo {
 public static void main(String[] args) {
    int[] arr=new int[] {1,9,4,7,5,59,47,29,25};
     Arrays.sort(arr);
     System.out.println("排序后:"+Arrays.toString(arr));    
     System.out.println("目标元素的位置:"+binary(arr, /*例如查找7*/ 7));
        
     }
 public static int  binary(int[] arr,int value) {
     int head=0;
     int tail=arr.length-1;

     while(head<=tail) {
        int mid=(head+tail)/2;
        if(value==arr[mid]) {
            return mid;
        }
        if(value<arr[mid]) {
            tail=mid-1;
        }
        if(value>arr[mid]) {
            head=mid+1;
        }
     }
    return -1;
 }
}
打印输出结果:
排序后:[1, 4, 5, 7, 9, 25, 29, 47, 59]
目标元素的位置:3
#########################################分隔符#############################################

控制台输入一组数,找出关键字和最大值
package learning;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 二分法查找
 * @author Lee
 *
 */
public class TestTwo {
 public static void main(String[] args) {
    
         int[] arr=new int[10] ;
         for(int i=0;i<10;i++) {
         @SuppressWarnings("resource")
         Scanner input =new Scanner(System.in);
         System.out.println("please input 10 number:");
         arr[i]=input.nextInt();
          System.out.println("输入的数字为:"+Arrays.toString(arr));
        
       } 
         Arrays.sort(arr);
         System.out.println("排序后:"+Arrays.toString(arr));
         int local=arr.length-1;
         int max=arr[local];
         System.out.println("目标元素的位置:"+binary(arr, 25));
         System.out.println(max);
     }

 public static int  binary(int[] arr,int value) {
     int head=0;
     int tail=arr.length-1;

     while(head<=tail) {
        int mid=(head+tail)/2;
        if(value==arr[mid]) {
            return mid;
        }
        if(value<arr[mid]) {
            tail=mid-1;
        }
    if(value>arr[mid]) {
            head=mid+1;
        }
     }
    return -1;
 }
}
打印输出结果:

please input 10 number:
11
输入的数字为:[11, 0, 0, 0, 0, 0, 0, 0, 0, 0]
please input 10 number:
22
输入的数字为:[11, 22, 0, 0, 0, 0, 0, 0, 0, 0]
please input 10 number:
33
输入的数字为:[11, 22, 33, 0, 0, 0, 0, 0, 0, 0]
please input 10 number:
25
输入的数字为:[11, 22, 33, 25, 0, 0, 0, 0, 0, 0]
please input 10 number:
55
输入的数字为:[11, 22, 33, 25, 55, 0, 0, 0, 0, 0]
please input 10 number:
77
输入的数字为:[11, 22, 33, 25, 55, 77, 0, 0, 0, 0]
please input 10 number:
44
输入的数字为:[11, 22, 33, 25, 55, 77, 44, 0, 0, 0]
please input 10 number:
99
输入的数字为:[11, 22, 33, 25, 55, 77, 44, 99, 0, 0]
please input 10 number:
88
输入的数字为:[11, 22, 33, 25, 55, 77, 44, 99, 88, 0]
please input 10 number:

100
输入的数字为:[11, 22, 33, 25, 55, 77, 44, 99, 88, 100]
排序后:[11, 22, 25, 33, 44, 55, 77, 88, 99, 100]
目标元素的位置:2
100

猜你喜欢

转载自www.cnblogs.com/silly-bird/p/10326212.html
今日推荐