快速排序

简介

快速排序是使用分治思想进行排序的一种方法,其平均效率较高,故被经常使用。一般来说,快速排序的平均算法复杂度是O(nlogn),最差情况下的算法复杂度为O(n^2)

基本思想

1.先从数列里取出一个数作为基准,一般取列表中的第一个数字
2.从数列首尾遍历,将比基准数大的数字放到其右边,将比基准数字小的数字放到左边
3.基准数字位置确定,在其左边区域和右边区域递归2中的操作,直到各区间只有一个数

基本代码
package quick.sort;

import edu.princeton.cs.algs4.StdRandom;

public class Quick {
    private static int partition(Comparable[] a, int lo, int hi){

        int i = lo, j = hi + 1;
        while (true){

            while (less(a[++i], a[lo]))
                if (i == hi) break;

            while(less(a[lo], a[--j]))
                if(j == lo) break;

            if (i >= j) break;
            exch(a, i, j);
        }
        exch(a, lo, j);
        return j;
    }

    private static void sort(Comparable[] a, int lo, int hi){
        if (lo >= hi) return;
        int j = partition(a, lo, hi);
        sort(a, lo, j-1);
        sort(a, j+1, hi);
    }

    public static void sort(Comparable[] a){
        // shuffle函数将数列中的数字顺序打乱,防止数列有序,增加算法复杂度
        StdRandom.shuffle(a);
        sort(a, 0, a.length - 1);
    }

    private static void exch(Comparable[] a, int i, int j) {
        Comparable swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }

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

推荐阅读更多精彩内容

  • 快速排序的总结和优化 基础快排快排的基本框架就是下边这样。更鲁棒一点的话,还需要考虑传入的array是否是非法参数...
    Mereder阅读 255评论 0 0
  • 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它...
    ___瘦不了阅读 266评论 0 1
  • 快速排序 优点:原地排序(只需要很小的辅助栈)时间复杂度:NLgN 缺点:非常脆弱。有无数例子证明许多错误能致使它...
    melouverrr阅读 623评论 0 0
  • quicksort可以说是应用最广泛的排序算法之一,它的基本思想是分治法,选择一个pivot(中轴点),将小于pi...
    黎景阳阅读 486评论 0 1
  • 对于快速排序,如果排序的数组中有很多的重复数如10000个【1,9】的数就有很多重复数,由于快速排序的判定问题,会...
    一个人的飘阅读 1,710评论 0 0