当前位置:   article > 正文

快速排序 图解算法过程_快速排序的算法流程图

快速排序的算法流程图

快速排序基本步骤

步骤一:划分
  (1)选择数组的尾元素做为支点,支点选择方案有很多。
  (2)把>=支点的元素放到右边。
  (3)把<=支点的元素放到左边。
  (4)将支点放到正确的位置。
步骤二:递归
  对支点左右两边的子数组再分别调用步骤一,直到子数组长度为1。



代码如下:

  1. package com.collonn.algorithm.sort;
  2. /**
  3. * <pre>
  4. * 快速排序基本步骤
  5. * 步骤一:划分
  6. * (1)选择数组的尾元素做为支点,支点选择方案有很多。
  7. * (2)把>=支点的元素放到右边。
  8. * (3)把<=支点的元素放到左边。
  9. * (4)将支点放到正确的位置。
  10. * 步骤二:递归
  11. * 对支点左右两边的子数组再分别调用步骤一,直到子数组长度为1。
  12. * </pre>
  13. */
  14. public class QuickSort {
  15. // 快速排序
  16. public void quickSort(int[] s, int start, int end) {
  17. System.out.printf("\nquickSort,start=%d, end=%d", start, end);
  18. if (start >= end) {
  19. return;
  20. }
  21. int k = this.divide(s, start, end);
  22. System.out.printf("\n下标为:%d,值为:%d的元素,找到正确位置", k, s[k]);
  23. this.quickSort(s, start, k - 1);
  24. this.quickSort(s, k + 1, end);
  25. }
  26. // 在支点选择方案中,我是总是直接将s[end]选择为支点,当然你可以自己制定其它的方案
  27. // 举个例子,比较start, end, (start + end)/2这三个位置的值,选择中间值做为支点,并将其与end交换,最后选择end为支点
  28. private void selectPivot(int[] s, int start, int end) {
  29. // nothing to do
  30. }
  31. // 快速排序的划分过程
  32. private int divide(int[] s, int start, int end) {
  33. // 选择支点
  34. this.selectPivot(s, start, end);
  35. // 从左向右查找>=支点的元素的下标
  36. int i = start;
  37. // 从右向左查找<=支点的元素的下标
  38. int j = end - 1;
  39. // 找到正确位置的元素的正确位置下标
  40. int k = -1;
  41. System.out.printf("\n开始划分,i=%d,j=%d,start=%d,end=%d", i, j, start, end);
  42. while (true) {
  43. // 从左向右查找>=支点的元素
  44. while (i <= j) {
  45. if (s[i] >= s[end]) {
  46. break;
  47. }
  48. i++;
  49. }
  50. System.out.printf("\n左向右,i=%d", i);
  51. // 如果未找到,则交换,本次划分结束
  52. if (i > j) {
  53. System.out.printf("\n左向右未找到>=%d的元素", s[end]);
  54. k = i;
  55. this.swap(s, i, end);
  56. break;
  57. }
  58. // 从右向左查找<=支点的元素
  59. while (i <= j) {
  60. if (s[j] <= s[end]) {
  61. break;
  62. }
  63. j--;
  64. }
  65. System.out.printf("\n右向左,j=%d", j);
  66. // 从左向右,从右向左都找到合适的元素,则交换,然后在本次划分中继续找
  67. if (i < j) {
  68. System.out.printf("\n右向左找到元素:%d, 左向右找到元素:%d", s[i], s[j]);
  69. this.swap(s, i, j);
  70. i++;
  71. j--;
  72. }
  73. // 从右向左没有找到,则交换,本次划分结束
  74. if (i >= j) {
  75. System.out.printf("\n右向左未找到<=%d的元素", s[end]);
  76. this.swap(s, i, end);
  77. k = i;
  78. break;
  79. }
  80. }
  81. // 打印数组
  82. PrintArray(s);
  83. return k;
  84. }
  85. private void swap(int[] s, int i, int j) {
  86. System.out.printf("\n交换下标:%d,%d", i, j);
  87. int t = s[i];
  88. s[i] = s[j];
  89. s[j] = t;
  90. }
  91. // 打印数组
  92. private static void PrintArray(int[] s) {
  93. System.out.print("\n下标:");
  94. for (int p = 0; p < s.length; p++) {
  95. System.out.printf("%2d,", p);
  96. }
  97. System.out.print("\n值值:");
  98. for (Integer m : s) {
  99. System.out.printf("%2d,", m);
  100. }
  101. }
  102. public static void main(String[] args) {
  103. int[] s = new int[] { 99, 88, 5, 99, 7, 9, 3, 8, 10, 90, 56, 83, 39, 22 };
  104. // int[] s = new int[] { 99, 88, 5, 99, 7, 9, 3, 8,};
  105. // 打印数组
  106. PrintArray(s);
  107. QuickSort quickSort = new QuickSort();
  108. quickSort.quickSort(s, 0, s.length - 1);
  109. // 打印数组
  110. PrintArray(s);
  111. }
  112. }



原创博文,转载请注明出处。

右键,查看图片,看大图。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/640423
推荐阅读
相关标签
  

闽ICP备14008679号