一、基本的快速排序
在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组快速排序,直到数组排序完成。
代码实现:
public void quickSorted ( int arr[] ) {
int n = arr.length - 1; // 闭区间 [0...n]
__quickSorted (arr, 0, n);
}
private __quickSorted( int arr[], int L, int R) {
if ( (L >= R) {
return;
}
// 将基点移动到最终位置的方法
int p = __partioner(arr, L, R);
// 递归拆分数组
__quickSorted(arr, L, p - 1);
__quickSorted(arr, p + 1, R);
}
那么最大的问题就是怎么把这个基点移动到它最终应该所在的位置。
代码实现:
private int __partioner ( int arr[], int L, int R ) {
int v = arr[L];
// [L + 1, j] < v ; [j + 1, i) > v;
int j = L;
for ( int i = L + 1; i <= R; i++ ) {
if ( arr[i] < v) {
// 交换 arr[i] 和 arr [j + 1]
int tmp = arr[j + 1];
arr[j + 1] = arr[i];
arr[i] = tmp;
j++;
}
}
// 交换 arr[j] 和arr[L]
int tmp = arr[j];
arr[j] = arr[L];
arr[L] = tmp;
return j;
}
最终实现:
public void quickSorted ( int arr[] ) {
int n = arr.length - 1; // 闭区间 [0...n]
__quickSorted (arr, 0, n);
}
private __quickSorted( int arr[], int L, int R) {
if ( (L >= R) {
return;
}
// 将基点移动到最终位置的方法
int p = __partioner(arr, L, R);
// 递归拆分数组
__quickSorted(arr, L, p - 1);
__quickSorted(arr, p + 1, R);
}
private int __partioner ( int arr[], int L, int R ) {
int v = arr[L];
// [L +