zoukankan      html  css  js  c++  java
  • 常用算法之---排序 和 查找

    排序

    一  冒泡

      1  原理

         通过多次嵌套循环比对交换位置;最终将有序的小的数字排在前面,大的排在后面;每一趟排序完成后会确定一个数字的最终位置。

       2  demo

       let arr=[6,3,8,2,9,1];
     let temp=0;
     for(let i=0;i<arr.length-1;i++){  //外层循环排序趟数,剩余最后一个数字的时候,位置已确定所以最后一个不必比对。
          for(let j=0;j<arr.length-1-i;j++){//内层循环每一趟比对多少次,每次比对后都会进一步缩小下次比对范围。
            if(arr[j]>arr[j+1]){
              temp=arr[j];
              arr[j]=arr[j+1];
              arr[j+1]=temp;
            }
          }
        }

       console.log(arr);

    二   快排

     1  原理

        就是一个无序的数组,拿一个当作参考,排序后,把所有比他小的放到左边,比他大的放到右边,然后 通过递归的方法,分别对左边和右边进行 排序。

        PS:基准总是取序列开头的元素.

     

     

     2   demo

    console.time("快排");  //可以记录开始执行时间

         

    function quicksort(a,left,right){
    if(left>right){ //一定要有这个判断,因为有递归left和i-1,若没有这个判断条件,该函数会进入无限死错位递归
    return;
    }

    var i=left,
    j=right,
    jizhun=a[left]; //基准总是取序列开头的元素

    while(i!=j){ //该while的功能为每一趟进行的多次比较和交换最终找到位置k。当i==j时意味着找到k位置了
    while(a[j]>=jizhun&&i<j){j--} //只要大于等于基准数,j指针向左移动直到小于基准数才不进入该while。i<j的限制条件也是很重要,不然一直在i!=j这个循环里,j也会越界
    while(a[i]<=jizhun&&i<j){i++} //只要小于等于基准数,i指针向右移动直到大于基准数才不进入该while。等于条件也是必要的,举例[4,7,6,4,3]验证一下是两个4交换
    if(i<j){ //如果i==j跳出外层while
    t=a[i];
    a[i]=a[j];
    a[j]=t
    }
    }

    a[left]=a[i];//交换基准数和k位置上的数
    a[i]=jizhun;

    quicksort(a,left,i-1);
    quicksort(a,i+1,right);
    }

    var array=[4,7,2,8,3,9,12];
    console.log(quicksort(array,0,array.length-1));//排完序后再看array是[2, 3, 4, 7, 8, 9, 12]

     

    console.timeEnd("快排");  //可以记录结束执行时间

     

     

     

     

     

     

     

     

    查找

     二分法查找

    1  原理
    需要是有序的数组, 那要查找的值,和序列最中间的值对比,(加入是升序),那么小于对比的值 就往前面查找,
    如果大于这个值,就往后面查找。

    取中间值为比较对象,若等于关键字,则查找成功;若大于关键字,则在比较对象的左半区继续查找;若小于关键字,则在比较对象的右半区继续查找。不断重复上述过程直到查找成功,若所有查找区域无记录则查找失败。

     

     

     

    2  demo

    private int halfSearch(int[] arr, int target){
            int min = 0;//数组最小索引
            int max = arr.length - 1;//数组最大索引
            int mid = (min + max) / 2;//数组中间索引
            
            int i = 0;
            while(true){
                System.out.println("第" + ++i + "次,min:" + min + ";mid:" + mid + ";max:" + max);
                //跟中间值进行比较
                if (target > arr[mid]) {
                    min = mid + 1;
                }
                else if (target < arr[mid]) {
                    max = mid - 1;
                }
                else if(target == arr[mid]){
                    return mid;
                }
                //重新取中间索引
                mid = (min + max) / 2;
                //如果最小索引大于最大索引说明有问题,直接返回
                if (min > max) {
                    return -1;
                }
            }
        }

        

             测试:::

            int[] arr = {10, 12, 15, 17, 19, 20, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 46};
            int target = 32;
            
            int index = halfSearch(arr, target);
            System.out.println(index);

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    vue2 下载scss依赖包
    fastjson使用
    vscode format
    flutter 中涉的深拷贝
    通过pom给maven添加编译插件
    IDEA添加动态模板(Live Templates)
    Maven启动tomcat:run异常
    Redis
    tomcat启动时启动窗口出现乱码的解决方案
    无效的源发行版,解决方案
  • 原文地址:https://www.cnblogs.com/softwarelanguagebs/p/10596542.html
Copyright © 2011-2022 走看看