zoukankan      html  css  js  c++  java
  • javascript快速排序

    function quickSort(arr){
            //如果数组只有一个数,就直接返回;
            if(arr.length<1){
                return arr;    
            }
            
            //找到中间的那个数的索引值;如果是浮点数,就向下取整
            var centerIndex = Math.floor(arr.length/2);
            
            //根据这个中间的数的索引值,找到这个数的值;
            var centerNum = arr.splice(centerIndex,1);
            
            //存放左边的数
            var arrLeft = [];
            //存放右边的数
            var arrRight = [];
            
            for(i=0;i<arr.length;i++){
                if(arr[i]<centerNum){
                    arrLeft.push(arr[i])
                }else if(arr[i]>centerNum){
                    arrRight.push(arr[i])
                }
            }
            return quickSort(arrLeft).concat(centerNum,quickSort(arrRight));
            
        };
        var arrSort = [33,18,2,40,16,63,27];
        var arr1 = quickSort(arrSort);
        console.log(arr1);

    "妙味课堂"的一期视频教学。

    主要原理是:快速排序的原理:找基准点、建立二个数组分别存储、递归

    基准点:就是找到这个数组中间的一个数;

    建立二个数组分别存储:就是以这个基准点,将它的左右数值,分别存放到两个定义的新数组当中;

    递归:在函数内部调用自身;

     

    这里我总结的一点是在使用递归时:

    1.必需要有一个判断,并且返回一个值;不然就是一个死循环了;

    2.在内部调用自己的时候,传的参数是内部定义的某个变量,这个变量和初次传时来的参数,有关联;

    3.要执行同样的工作,可以考虑用递归;

     

    这是第一次执行函数的变量情况:中间数是40;根据循环里的判断条件小于40的存放在arrLeft,大于40的存放在arrRight里面。如下图

     

    第二次调用函数

    ,当执行到  return quickSort(arrLeft).concat(centerNum,quickSort(arrRight));

    quickSort(arrLeft)会去调用函数,传的参数是[33,18,2,16,27]

    中间数是2,比2小的放左边arrLeft,比2大的放右边arrRight

    最后再去调用quickSort(arrRight)

    后面一样循环调用自己,直到传入的参数长度,小于1,就返回这个传入的参数。

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/lufy/p/2526289.html
Copyright © 2011-2022 走看看