排序算法-快速排序

Posted natsu-cc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-快速排序相关的知识,希望对你有一定的参考价值。

实现原理:

快速排序的基本思想是:通过一趟排序算法把所需要排序的序列的元素分割成两大块,其中,一部分的元素都要小于或等于另外一部分的序列元素,然后仍根据该种方法对划分后的这两块序列的元素分别再次实行快速排序算法,排序实现的整个过程可以是递归的来进行调用,最终能够实现将所需排序的无序序列元素变为一个有序的序列。



代码:

//	方法1:
function quickSort(arr) 
    const len = arr.length;
    if(len < 2) 
        return arr;
    

    const midIndex = Math.floor(len / 2);
    const mid = arr.splice(midIndex, 1)[0];
    const left = [];
    const right = [];

    for(let i = 0; i < arr.length; i++) 
        if(arr[i] < mid) 
            left.push(arr[i]);
         else 
            right.push(arr[i]);
        
    

    return quickSort(left).concat([mid], quickSort(right));

选择一个中间的数字为基准点,用两个数组分别去保存比基准数小的值,和比基准数大的值,最后递归左边的数组和右边的数组,用concat去做一个数组的合并。

//	方法2:
function swap(arr, i, j) 
    const tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;


function divide(arr, left, right) 
    const pivot = left;
    let index = pivot + 1;
    for(let i = index; i <= right; i++) 
        if(arr[i] < arr[pivot]) 
            swap(arr, i, index);
            index++;
        
    
    swap(arr, pivot, index - 1);
    return index - 1;


function quickSort(arr, left = 0, right) 
    const len = arr.length;
    cosnt right = right || len - 1;;

    if(left < right) 
        const divideIndex = divide(arr, left, right);
        quickSort(arr, left, divideIndex - 1);
        quickSort(arr, divideIndex + 1, right);
    

    return arr;

从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(divide)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

总结:

快速排序分析:
  • 时间复杂度: 平均时间复杂度O(n*logn) 、最好情况O(n*logn)、最差情况O(n^2)
  • 空间复杂度: O(logn)
  • 稳定性:不稳定
快速排序优缺点:
  • 代码简单明了,可读性强,易于理解
  • 空间复杂度较高,以空间换时间

以上是关于排序算法-快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法class11 排序算法-快速排序

快速排序算法C#实现

快速排序算法学习总结

算法学习快速排序

数据结构与算法-----快速排序

快速排序算法总结