zoukankan      html  css  js  c++  java
  • 快速排序和二分查找

      快排和二分查找都基于一种叫做「分治」的算法思想,通过对数据进行分类处理,不断降低数量级,实现O(logN)(对数级别,比O(n)这种线性复杂度更低的一种,快排核心是二分法的O(logN),实际复杂度为O(N*logN))的复杂度。

      

    快速排序

    快排大概的流程是:

    1. 随机选择数组中的一个数 A,以这个数为基准
    2. 其他数字跟这个数进行比较,比这个数小的放在其左边,大的放到其右边
    3. 经过一次循环之后,A 左边为小于 A 的,右边为大于 A 的
    4. 这时候将左边和右边的数再递归上面的过程
    const Arr = [85, 24, 63, 45, 17, 31, 96, 50];
    function quickSort(arr) {
        if (arr.length <= 1) {
            return arr;
        }
        let pivotIndex = Math.floor(arr.length / 2);
        let pivot = arr.splice(pivotIndex, 1)[0];
        let left = [];
        let right = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        // 递归
        return quickSort(left).concat([pivot], quickSort(right));
    }
    
    console.log(quickSort(Arr));...
    
    https://juejin.im
    掘金 — 一个帮助开发者成长的社区

    二分查找

    二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是多维数组,只要有序,就可以用二分查找来优化。

    二分查找是一种「分治」思想的算法,大概流程如下:

    1. 数组中排在中间的数字 A,与要找的数字比较大小
    2. 因为数组是有序的,所以: a) A 较大则说明要查找的数字应该从前半部分查找 b) A 较小则说明应该从查找数字的后半部分查找
    3. 这样不断查找缩小数量级(扔掉一半数据),直到找完数组为止

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    function Find(target, array) {
        let i = 0;
        let j = array[i].length - 1;
        while (i < array.length && j >= 0) {
            if (array[i][j] < target) {
                i++;
            } else if (array[i][j] > target) {
                j--;
            } else {
                return true;
            }
        }
        return false;
    }
    
    //测试用例
    console.log(Find(10, [
        [1, 2, 3, 4], 
        [5, 9, 10, 11], 
        [13, 20, 21, 23]
        ])
    );...
    
    https://juejin.im
    掘金 — 一个帮助开发者成长的社区
  • 相关阅读:
    bootstrap table 怎么自适应宽度
    nginx解决超长请求串(413 request Entity too Large错误解决办法)
    nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题
    测试了下boost的序列化反序列化功能
    测试C++代码与WebBrowser HTML的互动
    Open SSL 开发环境配置
    modern-cpp-features
    Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)
    分布式事务
    Django admin
  • 原文地址:https://www.cnblogs.com/guoxianglei/p/9474846.html
Copyright © 2011-2022 走看看