算法概念
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
算法思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现思路
①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。
②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归)
③重复第①、②步,直到左区处理完毕。
算法实现
此处采用三数中值分割法,即关键字由(start + end) / 2 得到。
/**
* 快速排序
* 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)
* 此处采用三数中值分割法
*
* @param a
* @return
*/
public static void quickSort(int[] a, int start, int end) {
if (end <= start) {
return;
}
int center = (start + end) / 2;
int i = start;
int j = end;
while (i < j) {
int tmp;
if (a[i] > a[j]) {
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
if (a[i] > a[center]) {
tmp = a[i];
a[i] = a[center];
a[center] = tmp;
}
i++;
if (a[j] < a[center]) {
tmp = a[j];
a[j] = a[center];
a[center] = tmp;
}
j--;
}
if (end - start == 1) {
return;
}
quickSort(a, start, center);
quickSort(a, center, end);
}
public static void main(String[] args) {
int[] a = {5, 10, 4, 6, 9, 3, 2, 7, 10, 11};
quickSort(a, 0, a.length - 1);
for (int i : a) {
System.out.print(i + ",");
}
}