zoukankan      html  css  js  c++  java
  • 折半插入排序 之通俗易懂,图文+代码详解-java编程

    转自http://blog.csdn.net/nzfxx/article/details/51615439

    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;i<n;i++){
    int temp=arr[i];
    int low=0;
    int high=i-1;
    while (low<=high){
    int mid=low+(high-low)/2;
    if(temp>arr[mid]){
    low=mid+1;
    }else if(temp<arr[mid]){
    high=mid-1;
    }
    }
    for (j=i-1;j>=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<n;j++){
    System.out.print(" "+arr[j]);
    }
    System.out.println();
    }

    /**
    * 打印排序的每次循环的结果
    * @param arr
    * @param n
    * @param i
    */
    private void printProcess(int[] arr, int n, int i) {
    System.out.print("第"+i+"次:");
    for(int j=0;j<n;j++){
    System.out.print(" "+arr[j]);
    }
    System.out.println();
    }
    }
     
    运行结果:
    第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,最右边的end 3.无限循环当中找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
     
  • 相关阅读:
    思考问题的方式
    领域模型驱动设计读书笔记
    Oracle树形表和递归查询
    java中List , Set , Array相互转换
    JAVA两个数组间元素的比较(找出相同或者不同元素)
    java中的过滤器写法
    打印功能--调整表头
    @WebFilter注解
    深入理解JVM-内存模型(jmm)和GC
    vue生命周期函数
  • 原文地址:https://www.cnblogs.com/lijingran/p/8608323.html
Copyright © 2011-2022 走看看