认识快速排序

Posted dxj1016

tags:

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

9、快速排序

快排1.0:找一个轴值,大于轴值的在右边递归,小于等于轴值的时候在左边递归;

空间复杂度:

快排2.0:找一个轴值,大于轴值的在右边递归,小于轴值的在左边递归,等于轴值的不用动位置。

快排3.0:概率

package 左神算法.快速排序;

public class QuickSort 
    public static void main(String[] args) 
        int[] arr2 = 3, 5, 0, 3, 4, 5, 2, 6, 9, 6;
        int L = 0;
        int R = arr2.length - 1;
        quickSort(arr2, L, R);
        for (int i = 0; i < arr2.length; i++) 
            System.out.print(arr2[i] + " ");
        

    
//arr[l..r]排好序
    public static void quickSort(int[] arr, int L, int R) 
        if (L < R) 
            swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
            int[] p = partition(arr, L, R);
            quickSort(arr, L, p[0] - 1);//<区
            quickSort(arr, p[1] + 1, R);//>区
        
    

    //    这是一个处理arr[l..r]的函数
//    默认以arr[r]做划分,arr[r]->p <p ==p   >p
//    返回等于区域(左边界,右边界),所以返回一个长度为2的数组res,res[0] res[1]
    public static int[] partition(int[] arr, int L, int R) 
        int less = L - 1;//<区右边界
        int more = R;//>区左边界
        while (L < more) //L表示当前数的位置 arr[R]   ->  划分值
            if (arr[L] < arr[R]) //当前数<划分值
                swap(arr, ++less, L++);
             else if (arr[L] > arr[R]) //当前数>划分值
                swap(arr, --more, L);
             else 
                L++;
            
        
        swap(arr, more, R);
        return new int[]less + 1, more;
    

    public static void swap(int[] arr, int i, int j) 
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
    

/*
0 2 3 3 4 5 5 6 6 9 
 */

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

C语言快速排序算法及代码

快速排序-递归实现

决战西二旗|快速排序的优化

决战西二旗|快速排序的优化

python 快速排序

数据结构(15)---排序(冒泡排序, 快速排序, 归并排序, 计数排序)