排序算法之快速排序

51 阅读1分钟

快速排序是一种非常高效的排序算法,由托尼·霍尔在1960年提出。它采用分而治之的策略,将大问题分解成小问题来解决。快速排序的基本步骤如下:

  1. 选择基准值(Pivot) :从数列中挑出一个元素作为“基准值”(pivot)。

  2. 分区操作(Partitioning)

    • 将所有比基准值小的元素摆放到基准前面;
    • 所有比基准值大的元素摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归排序子序列:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

下面是算法的基本过程

未标题-1.gif

代码实现

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
};