快速排序(动画示例)

  • 动图

  • 由来

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

  • 简介

快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分
为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。
[ 比基准值小的数] 基准值 [ 比基准值大的数]
接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。
对“[ ]”里面的数据 进行排序时同样也会使用快速排序。

  • 图解

一、场景:对 6 1 2 7 9 3 4 5 10 8 这 10 个数进行排序
二、思路:
先找一个基准数(一个用来参照的数),为了方便,我们选最左边的 6,希望将 >6 的放到 6 的右边,<6 的放到 6 左边。
如:3 1 2 5 4 6 9 7 10 8
先假设需要将 6 挪到的位置为 k,k 左边的数 <6,右边的数 >6
(1)我们先从初始数列“6 1 2 7 9 3 4 5 10 8 ”的两端开始“探测 ”,先从右边往左找一个 <6 的数,再从左往右找一个 >6 的数,然后交换。我们用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 6,最右边 j=9 指向 8 ;
快速排序(动画示例)_第1张图片
(2)现在设置的基准数是最左边的数,所以序列先右往左移动(j–),当找到一个 <6 的数(5)就停下来。
接着序列从左往右移动(i++),直到找到一个 >6 的数又停下来(7);
(3)两者交换,结果:6 1 2 5 9 3 4 7 10 8;
快速排序(动画示例)_第2张图片
(4)j 的位置继续向左移动(友情提示:每次都必须先从 j 的位置出发),发现 4 满足要求,接着 i++ 发现 9 满足要求,交换后的结果:6 1 2 5 4 3 9 7 10 8;
快速排序(动画示例)_第3张图片
(5)目前 j 指向的值为 9,i 指向的值为 4,j-- 发现 3 符合要求,接着 i++ 发现 i=j,说明这一轮移动结束啦。现在将基准数 6 和 3 进行交换,结果:3 1 2 5 4 6 9 7 10 8;现在 6 左边的数都是 <6 的,而右边的数都是 >6 的,但游戏还没结束
快速排序(动画示例)_第4张图片
(6)我们将 6 左边的数拿出来先:3 1 2 5 4,这次以 3 为基准数进行调整,使得 3 左边的数 ❤️,右边的数 >3,根据之前的模拟,这次的结果:2 1 3 5 4
(7)再将 2 1 抠出来重新整理,得到的结果: 1 2
(8)剩下右边的序列:9 7 10 8 也是这样来搞,最终的结果: 1 2 3 4 5 6 7 8 9 10 (具体看下图)
快速排序(动画示例)_第5张图片
快速排序的每一轮处理其实就是将这一轮的基准数归位,当所有的基准数归位,排序就结束啦

  • Java实现

  • 方式一

public class QuickSort {
	public static void sort(int arr[], int low, int high) {
		int l = low;
		int h = high;
		int povit = arr[low];

		while (l < h) {
			while (l < h && arr[h] >= povit)
				h--;
			if (l < h) {
				arr[l] = arr[h];
				l++;
			}

			while (l < h && arr[l] <= povit)
				l++;

			if (l < h) {
				arr[h] = arr[l];
				h--;
			}
		}
		arr[l] = povit;
		print(arr);
		System.out.print("l=" + (l + 1) + "h=" + (h + 1) + "povit=" + povit + "\n");
		if (l - 1 > low)
			sort(arr, low, l - 1);
		if (h + 1 < high)
			sort(arr, h + 1, high);
	}

	static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " -> ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int low = 0;
		int high = 18;
		int[] arr = { 45, 43, 16, 4, 36, 36, 12, 17, 43, 12, 42, 7, 26, 23, 35, 4, 14, 21, 9 };
		QuickSort.sort(arr, low, high);
	}
}

参考:http://www.myexception.cn/other/2097152.html

你可能感兴趣的:(算法)