Quick Sort

  • 描述
    实现快速排序算法

  • 分析
    随机选择待排序数组中一个元素为中心轴,将所有小于中心轴的元素移到左边,大于中心轴的元素移到右边,然后对中心轴左边和右边按照以上步骤递归下去,直至有序。
    中心轴的选择很重要,比较好的情况就是恰好选择的元素就是数组的中位数,这时候递归树相对平衡,递归树的高也就是栈的深度,树越平衡,消耗的栈空间越少,最坏情况,即待排序数组逆序,可以演化为冒泡排序,且空间复杂度O(n)。

  • 时间复杂度O(nlogn),空间复杂度O(logn)

public class Solution {

    public void quickSort(int[] arr, int left, int right) {
        int pivotIndex = partition(arr, left, right);
        if(left < pivotIndex - 1)
            quickSort(arr, left, pivotIndex - 1);
        if(right > pivotIndex)
            quickSort(arr, pivotIndex, right);
    }

    public int partition(int[] arr, int left, int right) {
        int pivot = arr[(left+right)/2];
        while(left <= right) {
            while(arr[left] < pivot)
                ++ left;
            while(arr[right] > pivot)
                -- right;
            if(left <= right) {
                swap(arr, left, right);
                ++ left;
                -- right;
            }
        }
        return left;
    }

    public void swap(int[] arr, int a, int b) {
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 简介 快速排序是由C.A.R.Hoare在1960年发明的。快速排序可能是应用最广泛的排序算法了,快速排序的...
    谢朴欢阅读 3,342评论 0 3
  • 本文有七千字,阅读大约需要占用你10分钟时间。 好吧。。随便写的,我也不知道会花多久看完。因为写的比较烂,而且只是...
    锅与盆阅读 8,211评论 5 36
  • 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 是目前基于比较的内部排...
    金声玉振阅读 1,558评论 0 0
  • 快速排序是一种分治算法,将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分...
    sleepyjoker阅读 337评论 0 0
  • 作为最常用和好用的排序方法, 快速排序是每个工程师必须随时能够手写出代码和解释其运行原理的算法 快速排序算法 快排...
    陈码工阅读 440评论 0 0