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);

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/softwarelanguagebs/p/10596542.html
Copyright © 2011-2022 走看看