A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付维翔 中级黑马   /  2012-10-25 23:01  /  2147 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本实现方法,不仅可能对一个数组进行排序,也可以指定数组中部分元素进行排序,代码如下:
  1. public class QuicSort {

  2. /**
  3. * 一趟快速排序的方法
  4. *
  5. * @param array
  6. * 所要排序的数组
  7. * @param h
  8. * 排序子列的开始位置
  9. * @param p
  10. * 排序子列的结束位置
  11. * @return 返回当前一趟快速排序后,比较关键字所处于的位置
  12. */
  13. private static int quickPass(int[] array, int h, int p) {
  14. int i = h;
  15. int j = p;
  16. int x = array[i];// 比较所用的关键字
  17. while (i < j) {
  18. while ((array[j] >= x) && (i < j))
  19. // 自尾端进行比较
  20. j--;
  21. if (i < j) {
  22. array[i] = array[j];// 将小于关键字的记录移至i所指的位置,完成第一次交换
  23. i++;
  24. // 自首端进行比较
  25. while ((array[i] <= x) && (i < j)) {
  26. i++;
  27. if (i < j) {
  28. array[j] = array[i];// 将大于关键字的记录移到j所指的位置
  29. j--;
  30. }
  31. }
  32. }
  33. }
  34. array[i] = x;// 一趟快速排序完成,将x移至正确位置
  35. return i;
  36. }

  37. /**
  38. * 对一个数组的部分进行排序,
  39. *
  40. * @param array
  41. * 排序的数组
  42. * @param s
  43. * 排序开始的位置
  44. * @param t
  45. * 所要排序结束的位置
  46. */
  47. public static void quickSort(int[] array, int s, int t) {

  48. int i = 0;
  49. if (s < t) {// 未做数组越界检查的代码
  50. i = quickPass(array, s, t);
  51. quickSort(array, s, i - 1);
  52. quickSort(array, i + 1, t);
  53. }
  54. }

  55. /**
  56. * 对一个数组进行快速排序
  57. *
  58. * @param array
  59. * 排序的数组
  60. */
  61. public static void quickSort(int[] array) {

  62. int s = 0;
  63. int t = array.length - 1;
  64. int i = 0;
  65. if (s < t) {
  66. i = quickPass(array, s, t);
  67. quickSort(array, s, i - 1);
  68. quickSort(array, i + 1, t);
  69. }
  70. }

  71. /**
  72. * 输出排好序的数组
  73. *
  74. * @param array
  75. */
  76. private static void printArray(int[] array) {
  77. System.out.print("排过序的数组:");
  78. for (int a : array) {
  79. System.out.print(a + " ");
  80. }
  81. System.out.println("");
  82. }

  83. public static void main(String[] args) {
  84. int[] array1 = { 4, 1, 6, 3, 2, 9, 7 };
  85. quickSort(array1);// 此方法对一个数组使用快速排序法做升序排序
  86. System.out.println("对整个数组排序");
  87. printArray(array1);
  88. int[] array2 = { 4, 1, 6, 3, 2, 9, 7 };
  89. // 此方法,提供了对数组部分元素的进行排序的功能,比如,只排序数组中的前五位:
  90. quickSort(array2, 0, 4);
  91. System.out.println("仅对数组中前五位元素进行排序");
  92. printArray(array2);

  93. }
  94. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
本帖最后由 廖力 于 2012-11-11 21:57 编辑

感觉楼主写得快排不是那么简化啊
我也发个我写的吧 参照了《数据结构(C语言版) 》(严蔚敏 & 吴伟民)
现在看 依然觉得上面的算法最优 无论是占用空间还是运行时间
  1. package com.Lland;

  2. public class Sort {// 快速排序
  3.         public void quickSort(int[] array) {
  4.                 subQuickSort(array, 0, array.length - 1);
  5.         }

  6.         private void subQuickSort(int[] array, int low, int high) {
  7.                 if (low < high) {
  8.                         int pivotTag = partitions(array, low, high);
  9.                         subQuickSort(array, low, pivotTag - 1);
  10.                         subQuickSort(array, pivotTag + 1, high);
  11.                 }
  12.         }

  13.         private int partitions(int array[], int low, int high) {
  14.                 int pivotKey = array[low];
  15.                 while (low < high) {
  16.                         while (low < high && array[high] >= pivotKey)
  17.                                 high--;
  18.                         array[low] = array[high];
  19.                         while (low < high && array[low] <= pivotKey)
  20.                                 low++;
  21.                         array[high] = array[low];
  22.                 }
  23.                 array[low] = pivotKey;
  24.                 return low;
  25.         }
  26. }
复制代码
然后主方法:
  1. package com.Lland;

  2. import java.util.Random;

  3. public class MainClass {
  4.         public static void main(String[] args) {
  5.                 //申明要用的对象
  6.                 Random r = new Random();
  7.                 int[] i = new int[20];
  8.                 Sort s = new Sort();
  9.                 //随机化数组
  10.                 for(int j = 0; j < i.length; j++){
  11.                         i[j] = r.nextInt(100) + 1;
  12.                 }
  13.                 //打印数组
  14.                 for(int j = 0; j < i.length; j++){
  15.                         System.out.print(i[j]);
  16.                         if(j < i.length){
  17.                                 System.out.print(", ");
  18.                         }
  19.                 }
  20.                 System.out.println();
  21.                 //快排
  22.                 s.quickSort(i);
  23.                 //打印数组
  24.                 for(int j = 0; j < i.length; j++){
  25.                         System.out.print(i[j]);
  26.                         if(j < i.length){
  27.                                 System.out.print(", ");
  28.                         }
  29.                 }
  30.                 System.out.println();
  31.         }
  32. }
复制代码
但是这个也有缺点
是用最低位来做对比值所以还有平衡排序
思想是用最低位和最高位以及中间位3为数中 不大不小的那位来做关键值

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马