• Java实现二分法排序


    二分法:(二分法不是只能做数组,这里的数组只是为了举例)

    在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找,如果目标值大于中间值,从数组的后半段开始二分法查找

    二分法查找主要是比较的次数少,查找的速度快,平均性能好,但是待查表一定要是有序的,插入删除比较困难,所以二分法查找不适用于经常变动的有序列表.

    上代码:

     1 package cn.summerchill.sort;
     2 
     3 public class BinarySearch {
     4     public static void main(String[] args) {
     5         //有序排列数组(大到小,小到大无所谓)
     6         int[] array = {1,2,3,4,5,6,7,8,9,10};
     7         //打印二分法的返回值
     8         System.out.println(searchRecursive(array,0,array.length-1,9));
     9     }
    10     public static int searchRecursive(int[] array,int start,int end,int findValue){
    11         if(array==null){
    12             return -1;
    13         }
    14         if(start<=end){
    15             //中间位置
    16             int middle = (start + end)/2;
    17             //中值
    18             int middleValue = array[middle];
    19             if(findValue == middleValue){
    20                 //与中值相等就直接返回
    21                 //return middle;
    22                 return middleValue;
    23             }else if(findValue < middleValue){
    24                 //目标值小于中值,在中值前面找(这里调用了二分法的方法)
    25                 return searchRecursive(array,start,middle - 1,findValue);
    26             }else {
    27                 //目标值大于中值,在中值后面找(这里调用了二分法的方法)
    28                 return searchRecursive(array,middle + 1,end,findValue);
    29             }
    30         }else{
    31             //返回-1,查找失败
    32             return -1;
    33         }
    34     }    
    35 }

     ======================2017-10-22晚添加========

    自己写二分法:

     1 public class BinarySearch {
     2     public static void main(String[] args) {
     3         Integer arr[] = { 1, 2, 4, 6, 8, 11, 23 };
     4         binarySearch(arr,0,arr.length - 1, 23);
     5     }
     6     public  static void binarySearch(Integer[] arr,int start, int end, int num){
     7         if(arr != null && arr.length > 0){
     8             int middle = (end + start) / 2;
     9             //中间的值大于目标值
    10             /*
    11              一开始我处理的方式是 end = middle; start = middle 
    12              这样在查找最后一个元素的时候容易造成栈溢出 StackOverFlow
    13             因为查找最后一个元素的时候 (index-1  + index)/2 永远比index 小,找不到最后一个元素
    14             需要对 end - start == 1 做一个单独的判断.
    15             但是如果 end = middle -1 ; start = middle + 1 这种形式就没有问题了.
    16              */
    17             if(arr[middle] > num){
    18                 end = middle - 1;
    19                 binarySearch(arr, start, end, num);
    20             }else if(arr[middle] < num){//中间的值小于目标值
    21                 start = middle + 1;
    22                 binarySearch(arr, start, end, num);
    23             }else{//和中间的值相等
    24                 System.out.println("找到对应的值,值为:" + num);
    25             }
    26         }
    27     }
    28 }
  • 相关阅读:
    2021/9/20 开始排序算法
    快速排序(自己版本)
    2021/9/17(栈实现+中后缀表达式求值)
    2021/9/18+19(中缀转后缀 + 递归 迷宫 + 八皇后)
    20212021/9/13 稀疏数组
    2021/9/12 线性表之ArrayList
    开发环境重整
    Nginx入门
    《财富的帝国》读书笔记
    Linux入门
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/7111742.html
Copyright © 2020-2023  润新知