快速排序思想
快速排序是找一个标定的数据,让数组中小于这个数的,大于这个数的分为两组,这两组再分别进行标定分组,是个递归的过程。
但是,当数组近乎于有序时,快速排序退化为O(n^2)。为了防止这发生,选择的标定是随机选择的,而不是选择最左端点的值。
这里随机选择标定值,防止快排退化成O(n^2),把标定值移动到最前面后,暂存下来,然后右指针移动过程中比标定值小的就放在标定值处,左指针移动过程中比标定值大的放在刚刚右指针找的那个值,这样一直移动,知道L和R相遇,最后把标定值放在L处。
实现代码
private void quickSort(int[] array , int n) {
quickSortRecursive(array , 0 , n - 1);
}
//快速排序递归方程,对[L , R]区间进行排序
private void quickSortRecursive(int[] array , int L , int R) {
if (R - L <= 100) {
insertSortPart(array , L , R);
return;
}
if (L < R) {
int partition = partition(array , L , R);
quickSortRecursive(array , L , partition - 1);
quickSortRecursive(array , partition + 1 , R);
}
}
//计算标定值的索引
private int partition(int[] array , int L , int R) {
//int partition = array[L];
//随机生成标定值
int partitionIndex = (int)Math.random()*(R - L + 1) + L;
int temp = array[partitionIndex];
array[partitionIndex] = array[L];
array[L] = temp;
int partition = array[L];
while (L < R) {
while (L < R && array[R] >= partition) R--;
array[L] = array[R];
while(L < R && array[L] <= partition) L++;
array[R] = array[L];
}
array[L] = partition;
return L;
}
快排时间复杂度是O(nlogn),排序不稳定,当有大量重复的数据时,可以选择三路快速排序,小于标定值,等于标定值,大于标定值分开。