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

二分排序和二分查找

一、二分查找

/**
	 *@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标识关键元素需要插入的位置。

原文地址:https://www.cnblogs.com/musecho/p/12077028.html