利用递归实现快速排序,选定最有一个数为轴,遍历区间内的数值,通过交换使其左小右大(此时轴的位置就是排序后的位置,不论左右如何变换,此位置相对不变,所以可按此理论递归实现排序)。再分别为其左右两侧边的数字找准位置排序完成。 第一步:假设以最后一位作为轴,记为P,0位置记为i, 可能大于s[p]的倒数第二个位置记为j 第二步:循环数组,小于s[p]放到左边,大于s[p]通过和s[j]交换放到右边 for i <=j ; s[i] < s[p]; i++. 移动i的位置到下一次可进行寻找比s[P]小的数的位置 s[i] >= s[p]; swap(i, j—). s[i]不小区s[p]的数值时,交换i和j位置的数字,将i放到倒数第二个大于s[p]的位置上。因此时s[j]已经是大于s[p]的数值了,j需要—,向前移动一位等待再次放置比s[p]大的数值。 i > j; 如果i已经大于j,说明比s[p]小的数值已经全部找到了。此时swap(i,p)。(注:i==p的时候不必交换,为减少代码判断,swap具备了当两个位置相等是,不交换的功能) 第三步: 递归实现其他位置的定位

    image.png

    1. package com.ss.sort;
    2. import java.util.Arrays;
    3. import java.util.concurrent.ThreadLocalRandom;
    4. /**
    5. * <p>
    6. * 快速排序
    7. * </P>
    8. *
    9. * @author: zhangss
    10. * @since: 2022-05-07
    11. **/
    12. public class QuickSort {
    13. public static void main(String[] args) {
    14. // int[] s = {3, 6, 2, 7, 4, 9};
    15. for (int i = 0; i < 5_0000; i++) {
    16. int[] s = random(10);
    17. int[] cs = copy(s);
    18. quickSort(s, 0,s.length - 1);
    19. comparator(s, cs);
    20. // print(cs);
    21. // print(s);
    22. }
    23. }
    24. /**
    25. * 单轴快速排序
    26. * 选定一个轴位置为P, 将<P放到左边, >P放到右边。P位置就排好了
    27. * 括号括住的地方就是比P小最后一个位置
    28. * )3, 6, 2, 1, 4, 5
    29. * i, -, -, -, j, P
    30. *
    31. * s[i]<s[p]; i++
    32. * 3), 6, 2, 1, 4, 5
    33. * -, i, -, -, j, P
    34. *
    35. * s[i]>s[p]; swap(i, j--)
    36. * swap
    37. * 3), 4, 2, 1, 6, 5
    38. * -, i, -, -, j, P
    39. * j--
    40. * 3), 4, 2, 1, 6, 5
    41. * -, i, -, j, -, P
    42. *
    43. * s[i]<s[p]; i++
    44. * 3, 4), 2, 1, 6, 5
    45. * -, -, i, j, -, P
    46. *
    47. * s[i]<s[p];i++ i和j相等时,还不确定i位置的数是和p位置的大小,所以不需要再比较一次。
    48. * 3, 4, 2), 1, 6, 5
    49. * -, -, -, i/j, -, P
    50. *
    51. * s[i]<s[p]; i++
    52. * 3, 4, 2, 1), 6, 5
    53. * -, -, -, j, i, P
    54. *
    55. * i>j 跳出循环
    56. *
    57. * swap[i,p]; 此时i位置左边数小于s[i],右边数大于s[i]
    58. * 3, 4, 2, 1), 5, 6
    59. * -, -, -, j, i, P
    60. *
    61. * @param s 随机数组
    62. * @param L 左侧位置
    63. * @param R 右侧位置
    64. */
    65. public static void quickSort(int[] s, int L, int R){
    66. if (L >= R || R < 1) {
    67. return;
    68. }
    69. int i = L, j = R-1;
    70. for (; i <= j; ) {
    71. if (s[i] < s[R]) {
    72. i++;
    73. } else {
    74. swap(s, i, j--);
    75. }
    76. }
    77. swap(s, i, R);
    78. // print(s);
    79. // System.out.println("右边有序 i:" + (i+1) + "P:" + R);
    80. quickSort(s, i+1, R);
    81. // System.out.println("左边有序 L:" + L + "R:" + (i-1));
    82. quickSort(s, L, i - 1);
    83. }
    84. public static void swap(int[] s, int a, int b){
    85. if(a == b){
    86. return;
    87. }
    88. int temp = s[a];
    89. s[a] = s[b];
    90. s[b] = temp;
    91. }
    92. /**
    93. * 对数器
    94. * @param s
    95. * @param cs
    96. */
    97. public static void comparator(int[] s, int[] cs){
    98. Arrays.sort(cs);
    99. for (int i = 0; i < s.length; i++) {
    100. if (s[i] != cs[i]) {
    101. throw new RuntimeException("错误喽");
    102. }
    103. }
    104. }
    105. public static int[] copy(int[] s){
    106. int[] cs = new int[s.length];
    107. for (int i = 0; i < s.length; i++) {
    108. cs[i] = s[i];
    109. }
    110. return cs;
    111. }
    112. public static int[] random(int l){
    113. int[] s = new int[l];
    114. for (int i = 0; i < l; i++) {
    115. s[i] = ThreadLocalRandom.current().nextInt(-100, 100);
    116. }
    117. return s;
    118. }
    119. public static void print(int[] s){
    120. System.out.println(Arrays.toString(s));
    121. }
    122. }