#003- 快速排序
快排核心思想是 :
选定一个基准x,将比x小的值放到左边,比x大的值放到右边。
const partition = (arr, left, right) => {
let x = arr[left];
let i = left;
let j = right;
while(i < j) {
//先从前往后找小的,没找的的话一直继续
while( i < j && arr[j] > x) {
j --;
}
//找到了,将值填入坑里面,a[j]又变成了坑
if(i < j) {
a[i] = a[j];
}
//然后从前往后找大的,没找到继续找。
while(i < j && arr[i] < x) {
i ++;
}
//找到了,将值填入之前的坑里。
if(i < j) {
a[j] = a[i]
}
}
//将基准值填入坑
a[i] = x;
return i;
}
const quickSort = (arr,left,right) => {
const length = arr.length;
const start = left || 0;
const end = right !== undefined ? right : length - 1;
if(start < end) {
const index = partition(arr, start, end;)
quickSort(arr, start, index - 1);//调整基准值左边
quickSort(arr,index + 1,end); //调整基准值右边
}
return arr;
}
使用:
const newArr = [2, 3, 1, 4, 6, 5, 9, 8, 7];
// 测试下
let result = quickSort(newArr);
console.log(result); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
未完待续。。。
#快排算法2
算法参考某个元素值,将小于它的值放到左数组中,大于它的值放在右数组中。然后进行递归进行左右数组的操作。返回合并的数组就是已经排好顺序的数组了。
function quickSort(arr) {
if(arr.length < = 1) {
return arr;
}
let leftArr = [];
let rightArr = [];
let q = arr[0];
for(let i = 1; i < arr.length; i ++) {
if(arr[i] > q) {
rightArr.push(arr[i])
} else {
leftArr.push(arr[i])
}
}
return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}
module.exports = quickSort;