转自
1.特点及概念介绍
下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点: 1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位) 2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2 3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效. 5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环. 6.在排序中关键字比较次数同记录初始排列无关的
2.图文描述过程
现有需求:
1.有一个已经排列好顺序的从小到大的数组.2.请查询一个数字所在的角标位置.3.如果元素不存在,请给出如果插入,那么应该插入的位置.
3.代码详情(参考 https://www.cnblogs.com/snowcan/p/6244361.html)
public class BinaryInsertSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 3,1,5,7,2,4,9,6}; new BinaryInsertSort().binaryInsertSort(arr); } /** * 折半插入排序算法的实现 */ public void binaryInsertSort(int[] arr){ int n=arr.length; int i,j; for (i=1;iarr[mid]){ low=mid+1; }else if(temp =low;j--){ arr[j+1]=arr[j]; } arr[low]=temp; /** * 打印每次循环的结果 */ printProcess(arr,n,i); } /** * 打印排序结果 */ printResult(arr,n); } /** * 打印排序的最终结果 * @param arr * @param n */ private void printResult(int[] arr, int n) { System.out.print("最终排序结果:"); for(int j=0;j
运行结果: 第1次: 1 3 5 7 2 4 9 6 第2次: 1 3 5 7 2 4 9 6 第3次: 1 3 5 7 2 4 9 6 第4次: 1 2 3 5 7 4 9 6 第5次: 1 2 3 4 5 7 9 6 第6次: 1 2 3 4 5 7 9 6 第7次: 1 2 3 4 5 6 7 9 最终排序结果: 1 2 3 4 5 6 7 9
4.总结:
二分法查找,又称折半查找,大家需要记住的重点有
1.优点是比较次数少,查找速度快,平均性能好; 其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。它的算法要求是必须是顺序存储结构,必须有序排列2.确定最左边的start,最右边的end3.无限循环当中找mid角标对应的值,start和end会根据情况改变4.当发现start和end交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的start位置. 5.使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为(logn )。 原因:折半查找,每次都是1/2,设寻找t次,等式为2t =n,n为数据的总数,倒过来就答案B。 总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数,由于你n/2^k取整后>=1,即令n/2^k=1 6.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过 log2n+1 因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况: 一次二分剩下:n/2 两次二分剩下:n/2/2 = n/4 ...... m次二分剩下:n/(2^m) 在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为 n/(2^m)=1;
2^m=n;
此时时间复杂度为log2(n) 再与最后一个元素比较复杂度+1
所以时间复杂度为:log2(n)+1