Java常见排序算法之快速排序详解

一、简介

在上一篇文章,我们已经了解了二分查找的算法,今天所讲的快速排序算法就是依据二分法以及递归实现。快速排序采用分治的思想,首先在数组中选择一个基准点,然后从数组的两端扫描数组,设两个指示标志(low指向起始位置,hign指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和hign位置的值,然后从前半部分开始查找,发现有元素大于基准点的值,就交换low和hign位置的值,如此往复循环,直到 low >= hign,然后把基准点的值放到hi这个位置。一次排序就完成了。然后再采用递归的方式分别对左右两部分的数组进行再次排序。

二、排序思路

具体排序步骤以及分治思想如下图:

三、算法实现

/**
 * @Title: QuickSortUtils
 * @ProjectName java_sort
 * @Description: 快速排序工具类
 * @Author WeiShiHuai
 * @Date 2018/10/20 17:00
 */
public class QuickSortUtils {

    /**
     * 获取基准值的位置
     *
     * @param array 待排序数组
     * @param low   起始位置
     * @param hign  终止位置
     * @return
     */
    private static int getReferIndex(int[] array, int low, int hign) {
        //将第一个元素作为参照值
        int referenceValue = array[low];

        while (low < hign) {
            //从后往前找,如果没有找到比基准值小的元素,那么执行hign--
            while (low < hign && array[hign] >= referenceValue) {
                hign--;
            }
            //将比基准值小的值移动到左边
            array[low] = array[hign];

            //从前往后找,如果没有找到比基准值大的元素,那么执行low++
            while (low < hign && array[low] <= referenceValue) {
                low++;
            }
            //将比基准值大的数移动到右边
            array[hign] = array[low];
        }
        array[low] = referenceValue;
        return low;
    }

    /**
     * 快速排序递归实现
     *
     * @param arr  待排序数组
     * @param low  起始位置
     * @param hign 终止位置
     * @return
     */
    public static int[] quickSort(int[] arr, int low, int hign) {
        if (low >= hign) {
            return null;
        }
        int middleIndex = getReferIndex(arr, low, hign);
        //递归对左边的数组(所有比基准值小的元素)进行排序
        quickSort(arr, low, middleIndex - 1);
        //递归对右边的数组(所有比基准值大的元素)进行排序
        quickSort(arr, middleIndex + 1, hign);
        return arr;
    }

}

测试:

public class TestQuickSortUtils {
    public static void main(String[] args) {
        int[] array = {4, 3, 6, 9, 7, 1, 2, 4};
        int[] newArr = QuickSortUtils.quickSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(newArr));
    }
}

测试结果:

四、总结

本文是作者对快速排序算法的一些总结以及思路,仅供大家参考学习,一起学习一起进步。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/83216779
今日推荐