public void Random_QuickSort(int array[], int left, int right) {
//分治思想
if (left < right) {
int position = Random_Position(array, left, right);
Random_QuickSort(array, position+1, right);
Random_QuickSort(array, left, position-1);
}
}
public int Random_Position (int array[], int left, int right) {
int randomNum = left + (int)(Math.random() * (right - left + 1)) ;
exchange(array, randomNum, right);
return Position(array, left, right);
}
/**
*
* @param array 待排序的数组
* @param left 左边界
* @param right 右边界
* @return 返回该次确定的位置下标movingPoint+1
* targetNum 是主元
* 每次调用position()返回后,array[movingPoint+1]的左边的数比它小,右边的数比它大
*/
public int Position(int array[], int left, int right) {
int targetNum = array[right];
int movingPoint = left - 1;
for(int i=left; i<=right-1; i++) {
if (array[i] <= targetNum) {
//movingPoint下标维护着已经发现的不大于targetNum的数的集合
movingPoint = movingPoint + 1;
exchange(array, movingPoint, i);
}
}
exchange(array,movingPoint+1, right);
return movingPoint+1;
}
public void exchange(int array[], int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
如图所示,movingPoint左边保存已经发现的比targetNum小的集合,movingPoint->i之间保存比targetNum大的数
而i->right-1之间是还未与targetNum比较的数,下标right上保存着targetNum的值。