快排 快速排序
//入门:
function quickSort(arr){ if(arr.length<=1){return arr;} var pivotIndex=Math.floor(arr.length/2); var pivot=arr.splice(pivotIndex,1)[0]; //定义 var left=[]; var right=[]; //小的放left,大的放right for(var 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)); //大到小 //return quickSort(right).concat([pivot],quickSort(left)); }
//进阶
const quickSort = (array) => { const sort = (arr, left = 0, right = arr.length - 1) => { if (left >= right) {//如果左边的索引大于等于右边的索引说明整理完毕 return } let i = left let j = right const baseVal = arr[j] // 取无序数组最后一个数为基准值 let a = [50,3,8,22,9,656,12,35,699,666,1111,35,100] i=0 j=12; i=1 j=12; i=2 j=12; i=3 j=12; i=4 j=12; i=5 j=12; a = [50,3,8,22,9,656,12,35,699,666,1111,35,656] baseVal =100; i=5 j=12 i=5 j=11 a = [50,3,8,22,9,35,12,35,699,666,1111,35,656] i=8 j=11 a = [50,3,8,22,9,35,12,35,699,666,1111,699,656] i=8 j=10 i=8 j=8 a = [50,3,8,22,9,35,12,35,100,666,1111,699,656] while (i < j) {//把所有比基准值小的数放在左边 比基准值大的数放在右边 while (i < j && arr[i] <= baseVal) { //找到一个比基准值大的数交换 i++ } // arr[i] > baseVal 或 i == j; 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己(i 等于 j) arr[j] = arr[i] while (j > i && arr[j] >= baseVal) { //找到一个比基准值小的数交换 j-- } // arr[k] < baseVal 或 i == j; 将较小的值放在左边如果没有找到比基准值小的数就是将自己赋值给自己(i 等于 j) arr[i] = arr[j] } // i==j arr[j] = baseVal // 将基准值放至中央位置完成一次循环(这时候 j 等于 i ) // 0 7 sort(arr, left, j-1) // 将左边的无序数组重复上面的操作 // 9 12 sort(arr, j+1, right) // 将右边的无序数组重复上面的操作 } const newArr = array.concat() // 为了保证这个函数是纯函数拷贝一次数组 sort(newArr)
快排 快速排序
https://www.tongbiao.xyz/