快速排序算法
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
递归方法的简述请见 我之前的博文JAVA函数(方法)
对快速排序算法的了解请见快速排序算法-百度百科
这个算法光是无法理解的,直接上代码,追踪每一步的运行,对照每一轮的结果去理解。
public class ArrQuickSort {
public static void main(String[] args) {
int[] arr = new int[] { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 };
printfArr(arr);
System.out.println("=============================================================");
arrQuickSort(arr, 0, arr.length - 1);
System.out.println("=============================================================");
printfArr(arr);
}
// 快速排序
public static void arrQuickSort(int[] arr, int left, int right) {
if (left < right) {
System.out.println("\n-------------------------------------------------------------");
System.out.print(String.format("arrQuickSort left=%2d, right=%2d\t", left, right));
printfArr(arr);
System.out.print(
String.format("p=%d\tarr[%d]:%2d\tarr[%d]:%2d\n", left - 1, left, arr[left], right, arr[right]));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
int p = partition(arr, left, right);
arrQuickSort(arr, left, p - 1);
System.out.println("左边快速排序完成,开始对右面排序...");
arrQuickSort(arr, p + 1, right);
}
}
// 快速排序数组划分
private static int partition(int[] arr, int left, int right) {
int x = arr[right];
int p = left - 1;
for (int i = left; i < right; i++) {
System.out.print(String.format("partition i=%2d, p=%2d\t\t", i, p));
printfArr(arr);
if (arr[i] <= x) {
p++;
swap(arr, p, i);
System.out.print(String.format("arr[%d] <=> arr[%d] , p=%2d\t\t", i, p, p));
} else {
System.out.print("\t\t\t\t\t");
}
printfArr(arr);
System.out.println();
}
swap(arr, p + 1, right);
System.out.print("partition last :\t\t\t");
printfArr(arr);
return p + 1;
}
// 交换数组a中的a[i]和a[j]
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void printfArr(int[] arr) {
// 输出数组元素开头的符号{
System.out.print("{ ");
for (int i = 0; i < arr.length; i++) {
// 中间的元素输出格式为 值,
// 最后一个元素后为} 前面没有,号
if (i < arr.length - 1) {
System.out.print(arr[i] + ", ");
} else {
// 最后一个元素输出
System.out.print(arr[i] + " }");
}
} // for
System.out.println();
}// void
}
运行结果如下:
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
=============================================================
-------------------------------------------------------------
arrQuickSort left= 0, right=11 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
p=-1 arr[0]:24 arr[11]: 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 0, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 1, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 2, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 3, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 4, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 5, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 6, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 7, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 8, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i= 9, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition i=10, p=-1 { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
partition last : { 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
左边快速排序完成,开始对右面排序...
-------------------------------------------------------------
arrQuickSort left= 1, right=11 { 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
p=0 arr[1]:43 arr[11]:24
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 1, p= 0 { 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 2, p= 0 { 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 3, p= 0 { 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
arr[3] <=> arr[1] , p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 4, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 5, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 6, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 7, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 8, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i= 9, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition i=10, p= 1 { 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
partition last : { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
左边快速排序完成,开始对右面排序...
-------------------------------------------------------------
arrQuickSort left= 3, right=11 { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
p=2 arr[3]:43 arr[11]:35
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 3, p= 2 { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
partition i= 4, p= 2 { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
partition i= 5, p= 2 { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
partition i= 6, p= 2 { 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
arr[6] <=> arr[3] , p= 3 { 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
partition i= 7, p= 3 { 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
partition i= 8, p= 3 { 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
partition i= 9, p= 3 { 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
partition i=10, p= 3 { 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
partition last : { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
左边快速排序完成,开始对右面排序...
-------------------------------------------------------------
arrQuickSort left= 5, right=11 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
p=4 arr[5]:74 arr[11]:93
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 5, p= 4 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[5] <=> arr[5] , p= 5 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i= 6, p= 5 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[6] <=> arr[6] , p= 6 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i= 7, p= 6 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[7] <=> arr[7] , p= 7 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i= 8, p= 7 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[8] <=> arr[8] , p= 8 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i= 9, p= 8 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[9] <=> arr[9] , p= 9 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i=10, p= 9 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[10] <=> arr[10] , p=10 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition last : { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
-------------------------------------------------------------
arrQuickSort left= 5, right=10 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
p=4 arr[5]:74 arr[10]:66
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 5, p= 4 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
partition i= 6, p= 4 { 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[6] <=> arr[5] , p= 5 { 3, 5, 24, 25, 35, 43, 74, 54, 84, 36, 66, 93 }
partition i= 7, p= 5 { 3, 5, 24, 25, 35, 43, 74, 54, 84, 36, 66, 93 }
arr[7] <=> arr[6] , p= 6 { 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
partition i= 8, p= 6 { 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
{ 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
partition i= 9, p= 6 { 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
arr[9] <=> arr[7] , p= 7 { 3, 5, 24, 25, 35, 43, 54, 36, 84, 74, 66, 93 }
partition last : { 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
-------------------------------------------------------------
arrQuickSort left= 5, right= 7 { 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
p=4 arr[5]:43 arr[7]:36
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 5, p= 4 { 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
partition i= 6, p= 4 { 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
partition last : { 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...
-------------------------------------------------------------
arrQuickSort left= 6, right= 7 { 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
p=5 arr[6]:54 arr[7]:43
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 6, p= 5 { 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
{ 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
partition last : { 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...
左边快速排序完成,开始对右面排序...
-------------------------------------------------------------
arrQuickSort left= 9, right=10 { 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
p=8 arr[9]:74 arr[10]:84
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
partition i= 9, p= 8 { 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
arr[9] <=> arr[9] , p= 9 { 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
partition last : { 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...
左边快速排序完成,开始对右面排序...
=============================================================
{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
运行结果里面写的还算是比较清除的,有啥问题可以评论留言。