天天看点

快速排序

  程序员最不该缺的就是你的算法,算法是你的价值所在,你可以不会代码的具体的语法,但是必须得会算法。这个是我的见解。下面来写一一下传统的快速排序方法:(3步);

  1.找基准;

  2.分两边

  3.递归,重复上面的操作;

     代码: 

function quickSort (arr) {
    if(arr.length<=1) return arr;
    var referIndex = Math.floor(arr.length/2);
    var referNumber = arr.splice(referIndex,1)[0];
    var left = [],right = [];
    for(var i =0;i<arr.length;i++) {
        if(arr[i]<=referNumber) {
            left.push(arr[i]);
        }else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([referNumber],quickSort(right));

};
var a =[2,4,6,7,9,10,35];
quickSort(a);      

代码很简单就是这么几句话:

来左代码的分析:

1.判断arr的长度,如果小于等于1的就是他本身,不用排序,return 程序结束;

2.找一个参考的index基本找中间,因为号理解,最好是中间的就是最中间的值,理想状态这样的,因为这套算法就是取一个数,一分为二(左边为小数组,右边为大数组);

3.索引有了,我们根据这个索引取出这个值,arr.splice()这个方法就是,添加或者删除数组的中的数或者数组,返回的是修改后的数组.这里的返回的数组是一个数,所以取下标[0]

  splice的用法:

快速排序

4.声明两个数组,左边一个,右边一个;

5.遍历,把参考值和数组中的值进行比较,小的放左边的数组,大的放右边的数组;

6.然后,分下来的数组就是两个数组,然后递归,使用这个方法,在把这些数组再分,最后就是一个个数组,顺序大小排列好的数组

7.最后用数组的concat的方法,把所有数组打散拼成数组;如图:

快速排序

注意: 递归容易堆栈溢出,问题出在基数的选取, 如果是  arr[parseInt(a.length/2)] 

继续阅读