欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

八大排序——快速排序

程序员文章站 2022-06-18 10:34:15
...

快速排序

基本理解

快速排序首先挑出一个基准数字,在序列中分别从两头向中间遍历,将比基准数字大的数换到基准数字后面,比基准数字小的数换到基准数字前面,一趟快排下来,基准数字的位置就可以确定了,然后再将基准数字左半部分和右半部分分别再次进行快排……直到有序。

大致过程如下:

八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序八大排序——快速排序

每次快排结束的标志为high和low指向同一数字,(但此时还是需要在比较一下这个数字和基准数字的大小,进行交换),一次快排完毕之后,将基准数的左边右边分为两部分再次进行,以此循环,直到基准数字的某一边剩下1个或者0个数字时停止。


时空复杂度

时间复杂度O(nlog₂n):每次快排需要将当前序列遍历一遍,时间复杂度为n;一共需要log₂n次快排,所以时间复杂度为O(nlog₂n)。

空间复杂度O(log₂n):在进行快速排序时使用了递归来一层一层进行排序,占用内存最多的时刻是最后一趟排序,所占空间大小为log₂n。


另外快速排序是不稳定的排序。


最好最坏情况

快速排序的最好情况是随机分布的无序序列(越随机越好越无序越好);最坏情况是有序序列。

无论是最好情况还是最坏情况,快速排序的时间复杂度都为O(nlog₂n)。


代码实现(JAVA)

public static void quickSort(int[]nums,int begain, int length){
        //当所要排序的数组只剩下一个数或没有数时返回
        if( length-begain == 0 || length-begain == 1)
            return;
        int standar = begain;//基准数
        int low = begain+1;
        int high = length-1;
        while(high!=low){//停止一趟的比较交换
            //high从后往前找比standar小的数字进行交换
            while(high>low)//当high==low时停止 也就说明一趟结束
                if(nums[high]<nums[standar]){
                    swap(nums,high,standar);
                    standar = high;
                    break;//找到之后跳出
                }else
                    high--;
            //low从前往后找比standar大的数字进行交换
            while(low<high)
                if(nums[low]>nums[standar]){
                    swap(nums,low,standar);
                    standar = low;
                    break;
                }else
                    low++;
        }
        //比较high=low时的数字和基准数的大小进行交换
        if(nums[low]<nums[standar])
            swap(nums,low,standar);
        quickSort(nums,begain,standar);
        quickSort(nums,standar+1,length);
    }