快速排序的递归与非递归实现

╰半夏微凉° 2022-06-09 00:42 322阅读 0赞
  1. import java.util.Arrays;
  2. import java.util.Stack;
  3. class QuickSort
  4. {
  5. public static void quickSort(int[] array)
  6. {
  7. if (array==null||array.length==0)
  8. {
  9. return;
  10. }
  11. //递归算法
  12. //quickSortCore(array,0,array.length-1);
  13. //非递归
  14. quickSortCore2(array,0,array.length-1);
  15. }
  16. public static void quickSortCore(int[] array, int p, int r)
  17. {
  18. if (p<r)
  19. {
  20. int q=partition(array, p,r);
  21. quickSortCore(array,p,q-1);
  22. quickSortCore(array,q+1,r);
  23. }
  24. }
  25. public static int partition(int[] array, int p, int r)
  26. {
  27. int x=array[r];
  28. int i=p;
  29. int j=i;
  30. while (i<r)
  31. {
  32. if(array[i]<x)
  33. {
  34. swap(array,i,j);
  35. j++;
  36. }
  37. i++;
  38. }
  39. swap(array,r,j);
  40. return j;
  41. }
  42. public static void swap(int[] array, int i,int j)
  43. {
  44. int temp=array[i];
  45. array[i]=array[j];
  46. array[j]=temp;
  47. }
  48. //非递归,用循环?用栈记录?记录什么?记录当前划分序列的下标起始点
  49. public static void quickSortCore2(int[] array, int start, int end)
  50. {
  51. Stack<Integer> stack=new Stack<Integer>();
  52. stack.push(start);
  53. stack.push(end);
  54. while (!stack.empty())
  55. {
  56. //后进先出
  57. int r=stack.pop();
  58. int p=stack.pop();
  59. //划分的终止条件
  60. if (p>=r)
  61. {
  62. continue;
  63. }
  64. int q=partition(array,p,r);
  65. stack.push(p);
  66. stack.push(q-1);
  67. stack.push(q+1);
  68. stack.push(r);
  69. }
  70. }
  71. public static void main(String[] args)
  72. {
  73. int[] array={2,5,8,4,7,3,6};
  74. quickSort(array);
  75. System.out.println(Arrays.toString(array));
  76. }
  77. }

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读