类别 | 排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
平均情况 | 最好情况 | 最坏情况 | 辅助空间 | |||
交换排序 | 快速排序 | O(nlogn) | O(nlogn) | O(n²) | O(nlogn) | 不稳定 |
快速排序算法逻辑:
快速排序(Quick Sort)是从冒泡排序算法演变而来的,实际上是在冒泡排序基础上的递归分治法。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分
1.在数组中先选择一个基准元素,通常可以选择最左侧的元素为基准元素
2.标记最开始的最左侧和最右侧,low,height
3.设置left,right分别指向数组最左侧和最右侧
4.向左移动right指针,遍历,找到第一个比基准元素小的元素
5.将其元素放入到基准元素的下标数组中
6.切换到left指针,向右遍历,找到第一个比基准元素大的元素
7.将其元素放入到刚刚right指针指向的下标数组中
8.循环反复知道left==right
9.将基准元素放入到left==right的下标数组中,第一轮排序结束
10.开始第二轮,分为左右侧,左侧边界值为(low,left-1),右侧为(left+1,height),然后递归进行排序,自此算法实现结束
JAVA实现
import java.util.Arrays;
public class Main {
public static void sort(int[] a) {
if (a.length > 0) {
sort(a, 0, a.length - 1);
}
}
public static void sort(int[] a, int low, int height) {
int left = low;
int right = height;
if (left > right) {//放在k之前,防止下标越界
return;
}
int k = a[left];
while (left < right) {
while (left < right && a[right] > k) { //找出小的数
right--;
}
a[left] = a[right];
while (left < right && a[left] <= k) { //找出大的数
left++;
}
a[right] = a[left];
}
a[left] = k;
//对左边进行排序,递归算法
sort(a, low, left - 1);
//对右边进行排序
sort(a, left + 1, height);
}
public static void main(String[] args) {
int[] arr = {5, 9, 7, 4, 5, 7, 6, 1, 9, 9, 7, 4};
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println(Arrays.toString(arr));
}
}
结果为:
[5, 9, 7, 4, 5, 7, 6, 1, 9, 9, 7, 4]
[1, 4, 4, 5, 5, 6, 7, 7, 7, 9, 9, 9]