快速排序是一种非常高效的排序算法,由托尼·霍尔在1960年提出。它采用分而治之的策略,将大问题分解成小问题来解决。快速排序的基本步骤如下:
-
选择基准值(Pivot) :从数列中挑出一个元素作为“基准值”(pivot)。
-
分区操作(Partitioning) :
- 将所有比基准值小的元素摆放到基准前面;
- 所有比基准值大的元素摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
-
递归排序子序列:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
下面是算法的基本过程
代码实现
var sortArray = function(nums) {
function quickSort(left = 0,right = nums.length - 1){
if(left < right){
//2、获取到基准值的位置
const idx = findCenter(left,right);
//分区 递归遍历
quickSort(left,idx - 1);
quickSort(idx+1,right);
}
return nums;
}
function findCenter(start,end){
//1、随机选择基准值
const PrvotIdx = Math.floor(Math.random() * (end - start + 1)) + start;
if(PrvotIdx != start){
//如果选择的不是start位置的,则与start交换位置
[nums[start],nums[PrvotIdx]] = [nums[PrvotIdx],nums[start]]
}
const Pivot = nums[start];
let left = start + 1;
while(left< end){
// left大于基准值,则left与right交换位置,right向左移
if(nums[left]>Pivot){
[nums[i],nums[end]] = [nums[end],nums[i]]
end--;
}else{
//left小于基准值,则left向右移
left++;
}
}
//判断left是否大于基准值,大于的话则基准值与left-1交换位置
if(nums[left] > Pivot){
[nums[start],nums[left-1]] = [nums[left-1],nums[start]]
return left-1;
}
[nums[start],nums[left]] = [nums[left],nums[start]]
return left;
}
quickSort()
return nums
};