美文网首页
数据结构与算法:快速排序

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

作者: 我爱铲屎 | 来源:发表于2019-07-20 22:56 被阅读0次
经典快排

首先任意选取一个数据作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归的进行直到整个数组有序。可以发现其实每一趟快速排序都是在做一次荷兰国旗的划分。关于荷兰国旗问题可以查看这里

算法实现

在这里我们每次都选取序列的最后一个值作为划分的关键数据。
算法实现不是很难,先对数组进行划分,然后对数组左侧进行递归,对数组右侧进行递归。代码如下:

public static void quickSort(int[] arr,int left,int right) {
        if(left < right) {
            int[] p = partition(arr,left,right);    //划分
            
            quickSort(arr,left,p[0]-1);     //左递归
            quickSort(arr,p[1],right);  //右递归
        }
    }
    
    /*
     * 这里是荷兰国旗的划分,且以arr数组的最后一个数arr[right]作为划分的值。
     * */
    private static int[] partition(int[] arr,int left, int right) {
        
        int less = left - 1;
        int more = right + 1;
        
        while(left < more) {
            
            if(arr[left] < arr[right]) {
                
                swap(arr,++less,left++);
                
            }else if(arr[left] > arr[right]) {
                
                swap(arr,--more,left);
                
            }else {
                
                left++;
                
            }
        }
        return new int[] {less+1,more};
    }
    
    private static void swap(int[] arr,int i,int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
时间复杂度

排序的效率与数组的数据状况有关。
在极端的数据状况下,例如:1 2 3 4 5 6 7 8 9。我们每次一最后一个数据作为划分值,则每次只搞定最后一个数据,而每一次执行partition函数都要付出O(N)的时间代价,一共有N个数据,则时间复杂度为O(N^2);
在最理想的数据状况下,如下所示:等于划分值的区域在中间,其两侧被划分为等规模的样本空间,其花费时间为T(N) = 2T(N/2) + O(N);其最终求得的时间复杂度为O(N.logN)。关于递归行为时间复杂度的分析

 _____________________________________
|      N/2      | =X |     N/2        |
|_______________|____|________________|
稳定性

多个相同的值的相对位置也许会在划分过程中产生变动,所以快速排序不是一种稳定的排序算法。

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 排序算法6:快速排序

    数据结构与算法 快速排序为应用最多的排序算法,因为快速二字而闻名。快速排序和归并排序一样,采用的都是分治思想。 分...

  • 算法与数据结构路线图

    学习算法与数据结构,深刻理解计算机科学 排序算法:插入、冒泡、选择、希尔、快速、归并、堆排序、计数排序、桶排序、基...

  • 数据结构与算法——快速排序

    数据结构与算法——快速排序 快速排序,顾名思义,它速度很快,针对一般应用中各种不同的输入都要比其他排序算法快很多,...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • Python 算法大全

    这个库涵盖了多种算法和数据结构的介绍,比如: 排序算法(冒泡排序、希尔排序、插入排序、桶排序、合并排序、快速排序、...

  • 2019年5月份找工作面试知识点总结

    面试知识点 算法和数据结构 常用算法排序算法各种排序算法的时间复杂度,是否稳定内部排序快速排序 nlgn 不稳定冒...

  • C语言:关于数据的几种排序算法

    数据结构的排序算法有很多种。其中,快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法;基数排序、冒泡排序、...

  • 新的快速排序算法: 《Dual-Pivot QuickSort》

    相信大家在大学的《算法与数据结构》里面都学过快速排序(QuickSort), 知道这种排序的性能很好,JDK里面直...

网友评论

      本文标题:数据结构与算法:快速排序

      本文链接:https://www.haomeiwen.com/subject/avtplctx.html