1. package io.github.chenshun00.web.sort;
    2. import java.util.Arrays;
    3. /**
    4. * @author luobo.cs@raycloud.com
    5. * @since 2021/8/12 7:09 下午
    6. */
    7. public class QuickSort {
    8. public static void main(String[] args) {
    9. // int[] array = {1, 300, 29, 490, 961, 23, 47, 50, 234, 56, 23, 56, 678, 43, 672, 356, 35, 2, 994, 67, 98, 9, 345, 76, 345, 234, 4, 2, 645, 6, 235, 3, 563};
    10. int[] array = {100, 9, 190, 361, 2, 7, 5};
    11. sort(array);
    12. System.out.println(Arrays.toString(array));
    13. }
    14. public static void sort(int[] sourceArray) {
    15. quickSort(sourceArray, 0, sourceArray.length - 1);
    16. }
    17. private static void quickSort(int[] arr, int left, int right) {
    18. if (right > left) {
    19. //找到临界点
    20. int lingJieDian = find(arr, left, right);
    21. quickSort(arr, left, lingJieDian - 1);
    22. quickSort(arr, lingJieDian + 1, right);
    23. }
    24. }
    25. /**
    26. * 目标: 找到中间点
    27. * <p>
    28. * 1、明确开始位置(begin)、结束位置(end)、以及开始(start)的标杆数值
    29. * <code>
    30. * 1、从开始位置+1开始处理,如果比开始大,就从后开始找比开始位置小的,然后交换. 开始位置+1,后置位置-1。
    31. * 2、开始位置碰到结束位置的时候,就结束了
    32. * </code>
    33. *
    34. * @param arr 待排序数组
    35. * @param left 排序开始位置
    36. * @param right 排序结束位置
    37. * @return 中间点
    38. * int[] array = {100, 9, 190, 361, 2, 7, 5};
    39. * // 100 9 5 7 2 361 190
    40. */
    41. private static int find(int[] arr, int left, int right) {
    42. int end = right;
    43. int start = arr[left];
    44. //从开始位置找到结尾
    45. for (int i = left; i <= end; i++) {
    46. //当前位置值
    47. final int currentStart = arr[i];
    48. //如果大于基点位置
    49. if (currentStart > start) {
    50. //从后往前找
    51. for (int r = end; r >= i; r--) {
    52. //后边的值
    53. final int currentEnd = arr[r];
    54. //后边的值小于基点
    55. if (currentEnd < start) {
    56. //交换
    57. swap(arr, i, r);
    58. //向后走一下 && 继续从前往后走
    59. end--;
    60. break;
    61. } else {
    62. //继续向后走
    63. end--;
    64. }
    65. }
    66. }
    67. }
    68. //这里是核心,交换基点位置. 基点左边的都小于基点 & 基点右边的都大于基点
    69. swap(arr, left, end);
    70. return end;
    71. }
    72. /**
    73. * 交换
    74. *
    75. * @param array 数组
    76. * @param a 低位
    77. * @param b 高位
    78. */
    79. public static void swap(int[] array, int a, int b) {
    80. int temp = array[a];
    81. array[a] = array[b];
    82. array[b] = temp;
    83. }
    84. }