快速排序的JavaScript实现法:
/*
思路: 1. 先取一个基准值,然后用数组中的元素和基准值比较,比基准值大的放右边,比基准值小的放左边;基准值一般是取数组中的第一个值;
2. 第一轮完成后,以基准值为中心,左侧是比基准值小的数,右侧是比基准值大的数,但是左右两侧的数是无序的;然后分别对两侧的数据继续进行1操作
类似生活中的例子:上体育课站队时,老师让小明出列,然后比他矮的同学站左边,比他高的同学站右边;
*/
function quickSort(array, start = 0, end = array.length - 1) {
if (start < end) {
let mid = partion(array, start, end);
quickSort(array, start, mid - 1);
quickSort(array, mid + 1, end);
}
return array;
}
function exChange(array, i, j) {
let temp = array[i];
array[i] = array[j];
array[j] = temp;
}
function partion(array, start, end) {
// 选取数组的第一个值作为轴点元素
let pivot = array[start];
// 直接覆盖法
// while (start < end) {
// while (start < end && array[end] > pivot) {
// end--;
// }
// if (start < end && array[end] <= pivot) {
// array[start] = array[end];
// start++;
// }
// while (start < end && array[start] < pivot) {
// start++;
// }
// if (start < end && array[start] >= pivot) {
// array[end] = array[start];
// end--;
// }
// if(start == end) {
// array[start] = pivot;
// }
// }
// array[start]和array[end]值交换法
while (start < end) {
while (start < end && array[end] > pivot) {
end--;
}
if (start < end) {
exChange(array, start, end);
start++;
}
while (start < end && array[start] < pivot) {
start++;
}
if (start < end) {
exChange(array, start, end);
end--;
}
}
return start;
}