排序思路
① 若数组长度为0/1,直接返回结果,否则从数组中间取一个数字作为基准值
② 将数组从左到右分成三份 第一份中的数字小于基准值,第二份是基准值,第三份中数字大于基准值
③ 对第一份和第三份中的数字递归重复步骤①②,返回三份数组拼接起来的结果
以对数组[8,6,5,9,4,3]排序为例,画了个简图:
javascript实现
/** * 思路:在数组中间取一个数字作为基准值,大于基准值的数字放到右边子数组, * 小于基准值的数字放到左边子数组,拼接起来即得到最终结果 * @param arr */ function quickSort(arr){ //判断参数是否合法 if(!(arr instanceof Array)) return []; if(arr.length<=1) return arr; //定义基准值、左边数组、右边数组,并从原数组中去除基准值 var jizhun=arr.splice(Math.floor(arr.length/2),1), left=[], right=[]; //遍历去除基准值后的原数组 arr.forEach(function(n){ n<jizhun?left.push(n):right.push(n); }); //对左右数组分别快速排序,并返回结果 return quickSort(left).concat(jizhun,quickSort(right)); }
例如输入数组[5,4,1,3,2]
分解动作如下:
step1 基准值为1 ,分解结果 [],[1],[5,4,3,2]
step2 右侧数组,基准值为3,分解结果 [2],[3],[5,4]
step3 右侧数组,基准值为5 ,分解结果 [4],[5],[]
step4 假设三部分数组的名字分别为 left jz right ,则
result=left1+jz1+right1
right1= left2+jz2+right2
right2=left3+jz3+right3
所以result=left1+jz1+left2+jz2+left3+jz3+right3
结果是 [1,2,3,4,5]