• 【算法】二分排序和二分查找


    二分排序和二分查找

    一、二分查找

    /**
    	 *@title: binarySearch 
    	 *@description: 二分查找(参数数组必须有序)
    	 *@date: 2019年12月21日 上午10:37:25
    	 *@param arrayA 有序数组
    	 *@param key 关键元素
    	 *@return int 关键元素在数组中的下标
    	 */
    	public static int binarySearch(int[] arrayA, int key) {
    		int low = 0;
    		int high = arrayA.length - 1;
    		int mid = 0;
    
    		while (low <= high) {
    			mid = (low + high) / 2;
    
    			if (key < arrayA[mid]) {
    				high = mid - 1;
    			} else if (key > arrayA[mid]) {
    				low = mid + 1;
    			} else
    				break;
    		}
    
    		return mid;
    	}
    



    二、二分排序

    参考:

    https://www.jianshu.com/p/677359c1cc15


    代码:

    /**
    	  *@title: binarySort 
    	  *@description: 二分排序:总共有N个元素。
    	  *当插入第i个元素时,对前面的0~i-1个元素使用二分法,
    	  *找到该元素插入位置(相当于在有序数组中,一个一个插入新数值)
    	  *@date: 2019年12月21日 下午12:09:27
    	  *@param array 待排序数组
     	  *@return int[] 排序后的数组
    	  */
    	public static int[] binarySort(int[] array) {
    
    		for (int i = 1; i < array.length; i++) {
    			int temp = array[i];
    			int low = 0;
    			int high = i - 1;
    			int mid = -1;
    
    			while (low <= high) {
    				mid = (low + high) / 2;
    
    				if (temp < array[mid]) {
    					high = mid - 1;
    				} else { // temp >= array[mid])
    					low = mid + 1;
    				}
    			}
    
    			// 将low下标以后的元素全部向后移一位
    			for (int j = i - 1; j >= low; j--) {
    				array[j + 1] = array[j];
    			}
    
    			if (low != i)// 若待插入元素的插入位置不等于当前位置,则插入
    				array[low] = temp;
    		}
    
    		return array;
    	}
    



    注意 二分排序与二分查找的区别:

    两者的while循环内部不同,二分排序中判定相等不需要跳出循环

    【二分排序】跳出循环后下标low标识关键元素需要插入的位置。

  • 相关阅读:
    让textarea完全显示文章并且不滚动、不可拖拽、不可编辑
    解决css3毛玻璃效果(blur)有白边问题
    mysql_binlog恢复
    SED_AWK_正则
    进程;线程
    网络编程
    面向对象
    python_递归_协程函数(yield关键字)_匿名函数_模块
    Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数
    python_字符_函数
  • 原文地址:https://www.cnblogs.com/musecho/p/12077028.html
Copyright © 2020-2023  润新知