1. 快速排序
1.1 快速排序的基本介紹
對冒泡的一種改進
1.2 快速排序思想
首先將將要排序的數據分割成兩組,其中一組的所有數據都要比另外一組的任何一個數據小,然後再按照此方法進行快速排序。
1.3 快速排序的時間複雜度和空間複雜度等
算法名稱 | 平均時間複雜度 | 最好情況 | 最壞情況 | 空間複雜度 | 穩定性 |
---|---|---|---|---|---|
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | 不穩定 |
2. 代碼演示
/**
* @author shengjk1
* @date 2020/4/9
*/
public class QuickSort {
public static void main(String[] args) {
// int[] arr = {-9, 78, 0, 23, -567, 70};
int[] arr = new int[80000000];
for (int i = 0; i < 80000000; i++) {
arr[i] = (int) (Math.random() * 80000000);
}
quickSOrt(arr, 0, arr.length - 1);
// System.out.println("arr " + Arrays.toString(arr));
}
public static void quickSOrt(int[] arr, int left, int right) {
int l = left;
int r = right;
int pivot = arr[(l + r) / 2];
int temp = 0;
//while 循環的目的就是讓比 pivot
while (l < r) {
//在 pivot 的左邊一直找,找打大於等於 pivot 值,才退出
while (arr[l] < pivot) {
l++;
}
//在 pivot 的右邊一直找,找到小於等於 pivot 值,才退出
while (arr[r] > pivot) {
r--;
}
//說明 pivot 的左右兩值,已經按照左邊全部是小於等於 pivot 值,右邊全部大於等於 pivot 值。
if (l >= r) {
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交換完成後,發現 arr[i] == pivot r--,前移
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
}
if (l == r) {
l++;
r--;
}
// 向左遞歸
if (left < r) {
quickSOrt(arr, left, r);
}
if (right > l) {
quickSOrt(arr, l, right);
}
}
}
不理解的,自己多調一調