图解快速排序 QuickSort(附Java实现代码)

基本思想

快速排序(QuickSort)如其名称一样,是目前是效率最高的排序算法之一。主要的核心思想如下:
设有数列 [ v 1 , v 2 , . . . , v n ] [v_1, v_2, ..., v_n] ,现在对其进行重新排序,使其重新排序,满足 [ . . . , v 1 , . . . ] [..., v_1, ...] v 1 v_1 左右元素都小于等于 v 1 v_1 ,而在右侧的元素都大于等于 v 1 v_1 。例如, [ 5 , 1 , 3 , 7 , 8 , 2 , 9 , 4 , 6 ] [ 1 , 3 , 4 , 2 , 5 , 8 , 9 , 7 , 6 ] [\mathbf{5},1,3,7,8,2,9,4,6] \rightarrow [1,3,4,2,\mathbf{5},8,9,7,6] 。由于左边的数列的元素都比 v 1 v_1 小,而右边的子数列的元素都比 v 1 v_1 大,所以可以完全独立地通过递规调用,对 v 1 v_1 左右两测的子数列进行同样的快速排序,从而使整个数序的排序完成。

图解排序过程

目前比较困难的就是理解如何高效地根据 v 1 v_1 将原数组拆分成两个子数组。现在以上面的例子为输入,有以下排序过程。在下图中,绿色箭头表示正在移动的指针,蓝色箭头表示待移动指针,黄色表示当前操作的元素。
在这里插入图片描述

Java 代码实现

import java.util.Arrays;

public class QuickSort {
 
	public static void main(String[] args) {
		int[] arr = {1,3,5,2,4,8};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}

	static void sort(int[] ints){
		sort(arr, 0, arr.length- 1);
	}

	/**
	 * 快速排序。
	 * @param ints 输入待排序数组。
	 * @param start 开始位置。
	 * @param end 结束位置(注:包括此位置)。
	 * @return
	 */
    static int sort(int[] ints, int start, int end)
    {
        if (start >= end)
            return -1;  

        int last = ints[end];
        int pvt = 0, t = 0;

        for (int i = start; i <= end; i++)
        {
            if (ints[i] > last)
            {
                pvt++;
                continue;
            }
            for (int j = 0; j < pvt; j++)
            {
                t = ints[i - j - 1]; 
                ints[i - j - 1] = ints[i - j];
                ints[i - j] = t;
            } 
        }
        pvt = end - pvt;
        sort(ints, start, pvt - 1);
        sort(ints, pvt + 1, end);
        return pvt;
    }
}

输出:[1, 2, 3, 4, 5, 8]

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/89877652