快排
快排
核心思想
采用“分而治之”的思想,进行排序。选定一个基点,进行一趟遍历,将大于小于基点分别置换到该点的左边和右边(视乎升序降序需要),然后分别对左边区域和右边区域进行同样操作,直至区域只剩下一个点,此时排序完成。
代码实现
/**
* 快排
* @param {Array} arr 待排序数组
* @returns arr 排好序的数组
*/
function quickSort(arr) {
function sort(arr, l, r) {
// 如果只有一个元素,排序完成
if (l < r) {
// 交换排序,分区
const index = partition(arr, l, r);
// 对分区递归处理
sort(arr, l, index - 1);
sort(arr, index + 1, r);
}
return arr;
}
/**
* 以首元素为基点进行一轮快排
* @param {Array} arr 数组
* @param {Number} l 低位下标
* @param {Number} r 高位下标
* @returns index 基本点的下标
*/
function partition(arr, l, r) {
const baseIndex = l;
const base = arr[baseIndex];
while (l < r) {
// 高位往低位寻找比基点值小的元素
while (arr[r] >= base && l < r) {
--r;
}
// 低位往高位寻找比基点大的元素
while (arr[l] <= base && l < r) {
++l;
}
//交换位置
swapByIndex(arr, l, r);
}
// 将基本点放置在排好的数中间
swapByIndex(arr, baseIndex, l);
// 返回基本点点下标作为分区标识
return l;
}
/**
* 根据下标,将数组元素互换位置
* @param {Array} arr 数组
* @param {Number} a 元素下标
* @param {Number} b 元素下标
* @returns arr 操作后的数组
*/
function swapByIndex(arr, a, b) {
const temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
return arr;
}
return sort(arr, 0, arr.length - 1);
}