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


二分排序和二分查找

一、二分查找

/**
	 *@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標識關鍵元素需要插入的位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM