算法描述
快速排序使用分治法来把一个数组分为两个子数组。算法描述如下:
从数组中挑出一个元素,称为 “基准”(pivot),一般为arr[0],数组的第一个元素。
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 之后在基准左边是一个所有元素比基准小的数组,而基准右边是一个所有元素比基准大的数组,再对这两个数组使用上述步骤。
动画展示
代码实现
public class QuickSortMy {
public static void main(String[] args) {
quickSort(CommonStant.ARR, 0, CommonStant.ARR.length - 1);
Arrays.stream(CommonStant.ARR).forEach(System.out::println);
}
private static void quickSort(int[] arr, int left, int right){
if (left < right){
int middleIndex = partition(arr, left, right);
quickSort(arr, left, middleIndex - 1);
quickSort(arr, middleIndex + 1, right);
}
}
private static int partition(int[] arr, int left, int right) {
int target = left;
int index = target + 1;
for (int i = index; i <= right; i++) {
if (arr[i] < arr[target]){
swap(arr, index, i);
index++;
}
}
swap(arr, target, index - 1);
return index - 1;
}
private static void swap(int[] arr, int index, int i) {
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
总结
稳定性:算法不稳定,归并排序在排序前后两个相等的数相对位置发生改变。
时间复杂度:O(nlogn),最好情况O(nlogn), 最坏情况O(n^2)。
空间复杂度:O(logn),需要额外的变量进行存储。