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