快速排序
-
基本思路
- 选取一个基准值(一般为第一个),把大于基准值的放在基准值右边,小于基准值的放在基准值的左边,以此递归进行排序。
- 快速排序的时间复杂度为O(nlogn),是目前基于比较的内部排序里被认为是最好的方法,当数据过大并且数据是杂乱无序的时候,适合用快速排序。
-
快排优缺点
- 优点:平均性能好O(nlogn)
缺点:不稳定,如果初始的序列或基本的序列是有序的时候,时间复杂度为O(n²)。
- 优点:平均性能好O(nlogn)
-
代码实现
import java.util.Arrays;
/**
* @author Lu.F
* @version 1.0
* @date 2023/1/30 13:57
*/
public class QuickSortDemo {
public static void main(String[] args) {
int[] arr = new int[]{5, 1, 2, 3, 4, 6, 7, 8, 9};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
/**
* 快排,内排序中最快的排序,时间复杂度为O(nlogn)
* 基本思想:选取一个基准值(一般为队列中的第一个),左边的队列小于基准值,右边大于基准值
* 以此递归
*
* @param arr
* @param leftIndex
* @param rightIndex
*/
public static void quickSort(int[] arr, int leftIndex, int rightIndex) {
// 如果左边索引大于右边索引则跳出递归
if (leftIndex > rightIndex) {
return;
}
// 定义左指针,右指针
int left = leftIndex;
int right = rightIndex;
// 基准值
int key = arr[left];
// 当左指针小于右指针
while (left < right) {
// 找出右边小于基准值的数
while (right > left && arr[right] >= key) {
right--;
}
// 交换
arr[left] = arr[right];
// 找出左边大于基准值的数
while (left < right && arr[left] <= key) {
left++;
}
// 交换
arr[right] = arr[left];
}
// 基准值归位
arr[left] = key;
// 对基准值左边的元素排序
quickSort(arr, leftIndex, left - 1);
// 对基准值右边的元素排序
quickSort(arr, right + 1, rightIndex);
}
}