快速排序
排序思想
选取基准点,左右指针分别从左右进行选取进行交换,使左边数据小于等于基准点,右边数据大于基准点,返回基准点,进行递归。
核心代码
private static void quickSort(int[] arr, int left, int right) {
//递归结束的条件
if (left >= right) {
return;
}
//分区
int mid = partition(arr, left, right);
//左排序
quickSort(arr, left, mid - 1);
//右排序
quickSort(arr, mid + 1, right);
}
private static int partition(int[] arr, int left, int right) {
//选取基准点 减少取得最大值和最小值的几率
int randomIndex = new Random().nextInt(right - left + 1);
//将索引对于的值进行交换
swap(arr, randomIndex+left, right);
int pivot = arr[right];
//定义指针
int leftPtr = left;
int rightPtr = right - 1;
//考虑等于 当只用两个数字时 与后面的交换做匹配
while (leftPtr <= rightPtr) {
//从左边开始查找 找到大于基点的索引位置
while (leftPtr <= rightPtr && arr[leftPtr] <= pivot) {
leftPtr++;
}
//从右边开始查找 找到小于等于基点的索引位置
while (leftPtr <= rightPtr && arr[rightPtr] > pivot) {
rightPtr--;
}
//交换
if (leftPtr < rightPtr) {
swap(arr, leftPtr, rightPtr);
}
}
//将基准点置于中间位置
swap(arr, leftPtr, right);
return leftPtr;
}
特点
平均时间复杂度O(nlogn),最好时间复杂度O(nlogn),最坏时间复杂度O(n2),空间复杂度O(logn),不稳定