快速排序及其改進
阿新 • • 發佈:2019-02-04
快速排序的平均時間複雜度為O(N logN),空間複雜度O(logN)。
在待排序的陣列正好是正序或逆序時,時間空間複雜度為O(n^2),達到最快時間複雜度。
1.傳統快速排序
1.荷蘭國旗問題及三向切分
將小於num的數放在左邊,大於num放在右邊,等於num放在中間
3.隨機快速排序
//隨機快速排序 private void quickSort(int[] a){ if (a == null || a.length < 2) return; quickSort(a, 0, a.length - 1); } private void quickSort(int[] a, int l, int r){ if (l < r){ swap(a, l + (int)Math.random() * (r - l + 1), r); int[] p = partition(a, l, r); quickSort(a, l, p[0] - 1); quickSort(a, p[1] + 1, r); } } private int[] partition(int[] a, int l, int r){ int left = l - 1; int right = r; int cur = l; int num = a[r]; while(cur < right){ if (a[cur] < num){ swap(a, ++left, cur++); } else if (a[cur] > num){ swap(a, --right, cur); } else { cur++; } } swap(a, right, r); return new int[]{left + 1, right}; } private void swap(int[] a, int i, int j){ int tmp = a[i]; a[i] = a[j]; a[j] = tmp; }