图解排序算法:快速排序

Posted 算法爱好者

tags:

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

http://www.cnblogs.com/chengxiao/


基本思想


快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


基本步骤


1、三数取中



2、枢纽值进行分割


图解排序算法(5):快速排序


代码实现


package sortdemo;

import java.util.Arrays;

/**

 * Created by chengxiao on 2016/12/14.

 * 快速排序

 */

public class QuickSort {

    public static void main(String[] args) {

        int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

        quickSort(arr, 0, arr.length - 1);

        System.out.println("排序结果:" + Arrays.toString(arr));

    }

    /**

     * @param arr

     * @param left  左指针

     * @param right 右指针

     */

    public static void quickSort(int[] arr, int left, int right) {

        if (left < right) {

            //获取枢纽值,并将其放在当前待处理序列末尾

            dealPivot(arr, left, right);

            //枢纽值被放在序列末尾

            int pivot = right - 1;

            //左指针

            int i = left;

            //右指针

            int j = right - 1;

            while (true) {

                while (arr[++i] < arr[pivot]) {

                }

                while (j > left && arr[--j] > arr[pivot]) {

                }

                if (i < j) {

                    swap(arr, i, j);

                } else {

                    break;

                }

            }

            if (i < right) {

                swap(arr, i, right - 1);

            }

            quickSort(arr, left, i - 1);

            quickSort(arr, i + 1, right);

        }

    }

    /**

     * 处理枢纽值

     *

     * @param arr

     * @param left

     * @param right

     */

    public static void dealPivot(int[] arr, int left, int right) {

        int mid = (left + right) / 2;

        if (arr[left] > arr[mid]) {

            swap(arr, left, mid);

        }

        if (arr[left] > arr[right]) {

            swap(arr, left, right);

        }

        if (arr[right] < arr[mid]) {

            swap(arr, right, mid);

        }

        swap(arr, right - 1, mid);

    }


    /**

     * 交换元素通用处理

     *

     * @param arr

     * @param a

     * @param b

     */

    private static void swap(int[] arr, int a, int b) {

        int temp = arr[a];

        arr[a] = arr[b];

        arr[b] = temp;

    }

}


总结


快速排序是一种交换类的排序,它同样是分治法的经典体现。在一趟排序中将待排序的序列分割成两组,其中一部分记录的关键字均小于另一部分。然后分别对这两组继续进行排序,以使整个序列有序。


在分割的过程中,枢纽值的选择至关重要,本文采取了三位取中法,可以很大程度上避免分组"一边倒"的情况。快速排序平均时间复杂度也为O(nlogn)级。


图解排序算法系列





觉得本文有帮助?请分享给更多人

关注「算法爱好者」,修炼编程内功

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

《算法图解》读书笔记 - 快速排序

排序算法:图解快速排序算法--附带基于Python和JavaScript的实现

排序算法——快速排序的图解代码实现以及时间复杂度分析

图解快速排序算法

《图解算法》--快速排序哈希表图广度优先搜索算法

图解程序员必须掌握的Java常用8大排序算法