image.png
image.png
image.png
image.png

如果允许开额外空间

image.png
image.png
image.png

原地完成

image.png
如果e>v,直接i++
如果eimage.png
最后交换e与v


image.png
image.png
image.png

  1. public class QuickSort {
  2. private QuickSort() {
  3. }
  4. public static <E extends Comparable<E>> void sort(E[] arr) {
  5. sort(arr, 0, arr.length - 1);
  6. }
  7. private static <E extends Comparable<E>> void sort(E[] arr, int l, int r) {
  8. if (l >= r) {
  9. return;
  10. }
  11. int p = partition(arr, l, r);
  12. sort(arr, l, p - 1);
  13. sort(arr, p + 1, r);
  14. }
  15. private static <E extends Comparable<E>> int partition(E[] arr, int l, int r) {
  16. //arr[l+1,j] <v arr[j+1,i) >=v
  17. int j = l;
  18. for (int i = l + 1; i <= r; i++) {
  19. if (arr[i].compareTo(arr[l]) < 0) {
  20. j++;
  21. swap(arr, i, j);
  22. }
  23. }
  24. swap(arr, l, j);
  25. return j;
  26. }
  27. private static <E> void swap(E[] arr, int i, int j) {
  28. E temp = arr[i];
  29. arr[i] = arr[j];
  30. arr[j] = temp;
  31. }
  32. }

非递归

  1. //非递归实现
  2. private static void quickSort(int[] array) {
  3. if (array == null || array.length == 1) {
  4. return;
  5. }
  6. //存放开始于结束索引
  7. Stack<Integer> stack = new Stack<>();
  8. stack.push(0);
  9. stack.push(array.length - 1);
  10. //循环读取栈中的开始结束位置
  11. while (!stack.isEmpty()) {
  12. int right = stack.pop();
  13. int left = stack.pop();
  14. //右边界索引小于左边界索引说明结束了
  15. if (left >= right) {
  16. continue;
  17. }
  18. int i = partition(array, left, right);
  19. if (left < i - 1) {
  20. stack.push(left);
  21. stack.push(i - 1);
  22. }
  23. if (i + 1 < right) {
  24. stack.push(i + 1);
  25. stack.push(right);
  26. }
  27. }
  28. }
  29. private static int partition(int[] arr, int l, int r) {
  30. int j = l;
  31. for (int i = l + 1; i <= r; i++) {
  32. if (arr[i] < arr[l]) {
  33. j++;
  34. swap(arr, i, j);
  35. }
  36. }
  37. swap(arr, l, j);
  38. return j;
  39. }