本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
1、算法思想
在当前无序区 R[1..H] 中任取一个数据元素作为比较的"基准"(不妨记为 X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1] 和 R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即 R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当 R[1..I-1] 和R[I+1..H] 均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
排序过程:
初始关键字 [49 38 65 97 76 13 27 49]
一趟排序之后 [27 38 13] 49 [76 97 65 49]
二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序结果 13 27 38 49 49 65 76 97
2、算法代码
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int a[] ={13,15,37,89,60,39,12,109,56,72} ;
quickSort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
/**
* 快速排序
* @param array
* @param first
* @param last
*/
public static void quickSort(int[] array,int first,int last) {
int pIndex ;
if(first<last) {
pIndex = partition(array,first,last);//“基准”值位置
quickSort(array,first,pIndex-1);
quickSort(array,pIndex+1,last);
}
}
/**
* 一次划分,找到基准的位置
* @param array
* @param first
* @param last
* @return 基准的位置
*/
private static int partition(int[] array,int first,int last) {
int p =array[first];
while(first<last) {
while(first<last && array[last]>=p)
last--;
array[first] = array[last];
while(first<last && array[first]<=p)
first++;
array[last] = array[first];
}
array[first] = p;
return first;
}
}