1、二分查找法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分法的思想:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法
2、二分法排序
个人理解:二分法排序就是利用二分法查找结合插入排序实现,利用二分法找到要插入的位置,然后目标位置后面的元素往后移。
package com.tjsoft.web;
public class DEMO {
public static void main(String[] args) {
int[] arr = {42, 31, 26, 97, 35, 13, 12, 88, 1};
for (int i = 1; i < arr.length; i++) {
int temp = arr[i]; //要插入的第i个元素
int low = 0;
int high = i - 1; //插入目标元素的前 i-1 个元素
int mid = -1;
while (low <= high) {
mid = low + (high - low) / 2;//利用二分法寻找插入点
if (arr[mid] > temp) {
high = mid - 1;
} else { // 元素相同时,也插入在后面的位置
low = mid + 1;
}
}
// 目标位置 之后的元素 整体移动一位
for(int j = i - 1; j >= low; j--) {
arr[j + 1] = arr[j];
}
arr[low] = temp;
}
for (int i = 0; i < arr.length ; i++) {
System.out.print(arr[i]+" ");
}
}
}