关键:分治思想
函数 partition 难理解一些,多看下就好了
const swap = (arr, i, j) => {if (i === j) return;const temp = arr[i]arr[i] = arr[j]arr[j] = temp}// 获取 pivot 交换完后的 index// 关键函数 以 pivot 为锚点 左右分开。const partition = (arr, pivot, left, right) => {const pivotVal = arr[pivot]let startIndex = leftfor (let i = left; i < right; i++) {if (arr[i] < pivotVal) {swap(arr, i, startIndex)startIndex++}}swap(arr, startIndex, pivot)return startIndex}const quickSort = (arr, left, right) => {if (left < right) {// 取 最右侧 的元素作为 pivotlet pivot = rightlet partitionIndex = partition(arr, pivot, left, right)console.log('incccc', arr)quickSort(arr, left, partitionIndex - 1 < left ? left : partitionIndex - 1)quickSort(arr, partitionIndex + 1 > right ? right : partitionIndex + 1, right)}}const testArr = []let i = 0while (i < 10) {testArr.push(Math.floor(Math.random() * 1000))i++}console.log('unsort', testArr)quickSort(testArr, 0, testArr.length - 1);// unsort (10) [969, 549, 624, 140, 753, 281, 442, 884, 35, 681]// incccc (10) [549, 624, 140, 281, 442, 35, 681, 884, 969, 753]// incccc (10) [35, 624, 140, 281, 442, 549, 681, 884, 969, 753]// incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]// incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]// incccc (10) [35, 140, 281, 442, 549, 624, 681, 884, 969, 753]// incccc (10) [35, 140, 281, 442, 549, 624, 681, 753, 969, 884]// incccc (10) [35, 140, 281, 442, 549, 624, 681, 753, 884, 969]
