JAVA算法之快速排序

Posted JAVA笔试面试

tags:

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

JAVA算法之快速排序   
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


主要思路

1.切分:将待排序数组,根据某种切分方式(就是选择一个基准数),将数组切分为两部分,使得前一部分都都小于等于基准数,后一部分都大于基准数。
2.递归:对1中分治出来的两部分分别进行分治。


代码实现

快速排序实现

//切分

public static int partition(int[] array, int low, int high) {
        int key = array[low];
        while (low < high) {
            while (array[high] >= key && high > low) {// 从后半部分向前扫描
                high--;
            }
            array[low] = array[high];
            while (array[low] <= key && high > low) {// 从前半部分向后扫描
                low++;
            }
            array[high] = array[low];
        }
        array[high] = key;
        SorterUtil.print("排序之后", array);
        return high;
    }

    //递归排序

     public static void sort(int[] array, int low, int high) {
        if (low >= high) {
            return;
        }
        int index = partition(array, low, high);
        sort(array, low, index - 1);
        sort(array, index + 1, high);
    }



切分方法

对于基准位置的选取一般有三种方法:固定切分,随机切分和三取样切分。固定切分的效率并不是太好,随机切分是常用的一种切分,效率比较高,对于三数取中选择基准点是最理想的一种。


三取样切分法

关于这一改进的最简单的描述大概是这样的:与一般的快速排序方法不同,它并不是选择待排数组的第一个数作为中轴,而是选用待排数组最左边、最右边和最中间的三个元素的中间值作为中轴。这一改进对于原来的快速排序算法来说,主要有两点优势:
  (1) 首先,它使得最坏情况发生的几率减小了。
  (2) 其次,未改进的快速排序算法为了防止比较时数组越界,在最后要设置一个哨点。



时间复杂度

排序算法的最坏情况运行时间为θ(n2),且最坏情况发生在每次划分过程产生的两个区间分别包含n-1个元素和1个元素的时候。




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

排序算法之 Java简单快速排序算法

排序算法之快速排序Java实现

排序算法之JAVA终极快速排序法

JAVA算法之快速排序

排序算法之快速排序(Java)

排序算法之快速排序(Java)