二分排序和二分查找
一、二分查找
/**
*@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標識關鍵元素需要插入的位置。