一、先上代码,可直接用
1)可用代码
JavaScript实现快速排序:
/**
* JavaScript快速排序实现
* @param {*} arr
* @returns
*/
function quickSort(arr) {
if (arr.length < 2) {
return arr;
}
const pivotIndex = Math.floor(arr.length / 2);
const pivot = arr.splice(pivotIndex, 1)[0];//改变了原始序列
const left = [];
const right = [];
for (let 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));
}
2)运行实例和效果
3)源代码解析
在这个实现中,quickSort函数接受一个数组arr作为参数。
- 首先,我们检查数组的长度是否小于2,如果是,就直接返回数组,因为一个或零个元素的数组已经是有序的。
- 接下来,我们选择数组中的一个元素作为基准(pivot)。在这个实现中,我们选择数组中间的元素作为基准,但也可以选择其他策略,如随机选择或选择数组的第一个或最后一个元素。
- 然后,我们创建两个空数组left和right,用于存放小于和大于等于基准的元素。
- 接着,我们遍历原数组arr,将小于基准的元素添加到left数组,将大于等于基准的元素添加到right数组。
- 最后,我们使用递归调用quickSort函数对left和right数组进行排序,并将排序后的数组与基准元素合并,得到最终的排序数组。
这个实现中的quickSort函数使用了递归和分治策略,将一个大的排序问题分解为两个较小的排序问题。当递归到最底层时,数组的长度小于2,直接返回。然后,递归返回的结果逐层向上合并,最终得到完全排序的数组。
二、快排原理
1)分治策略
快速排序采用了分治策略,将一个大的排序问题分解为两个较小的排序问题。
2)基准元素的选择
基准元素的选择对算法的效率有很大影响。不同的选择策略可能导致不同的排序效果。
3)稳定性问题
快速排序是一种不稳定的排序算法,即相等的元素在排序后可能会改变它们原有的相对顺序。
4)时间复杂度分析
快速排序的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。
三、快速排序优缺点
1)快速排序的优点
快速排序是一种非常高效的排序算法,平均时间复杂度为O(nlogn)。
2)快速排序的缺点
快速排序在最坏情况下的时间复杂度为O(n^2),且是一种不稳定的排序算法。
四、实际应用场景
快速排序在处理大量数据时非常有用,特别是在需要高效排序的场景中。然而,由于其不稳定性,和最坏情况下的时间复杂度问题,快排可能不适用于所有情况,需要根据实际情况选择合适的排序算法。