黑马程序员技术交流社区

标题: 快速排序 [打印本页]

作者: 徐强    时间: 2012-10-29 22:00
标题: 快速排序
本帖最后由 徐强 于 2012-10-30 09:32 编辑

晚上看了下排序的几种算法,对快还排序没怎么看明白,那位大神能给我讲讲,最好能贴出一份注释祥细的java代码。{:2_41:}
作者: 古银平    时间: 2012-10-29 22:24
我给你思想,希望你能编出代码,自己写了才会记住:
      快速排序顺利用递归原理,把数组无限制的分成两部分,直到所有数据都排好序为止。
分析:快速排序的基本思想是通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后按此方法对这两部分数据分别
         进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤:      
        如果要排序的数组是A[0].........A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比他小的数都放到它前面,所有比他大的数据都放到它
后面,这个过程称为一趟快速排序。一趟快速排序的算法如下:
(1)设置两个变量i,j,排序开始的时候:i=1,j=N-1.
(2)以第一个数组元素作为中间数据,赋值给pivot,即pivot=A[0]。
(3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于X的值。
(4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于X的值,并与上一步找到的数字交换。
(5)重复3,4步,直到i>=j。
(6)然后把j所在的数字与pivot交换。
(7)最后把j以前的数组和j到最后的数组,在进行递归的快速排序。

作者: 付维翔    时间: 2012-10-29 23:17
  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. }
复制代码

作者: 徐强    时间: 2012-10-30 10:48
受教了,自己学着写了一个出来看看。
  1. public class Sort {

  2.         /**
  3.          * 快速排序
  4.          */
  5.         public static void main(String[] args) {
  6.                 int arr[] = {4,12,5,1,97,16,3,7};

  7.                 quickSort(arr,0,arr.length-1);
  8.                 printArr(arr);

  9.         }

  10.         //用递归让整个数组序列化
  11.         private static void quickSort(int[] arr, int begin, int end) {
  12.                 if(begin>end){
  13.                         return ;
  14.                 }
  15.                 int i = onceSort(arr,begin,end);
  16.                 quickSort(arr,begin,i-1);
  17.                 quickSort(arr,i+1,end);
  18.         }

  19.         //打印数组
  20.         private static void printArr(int[] arr) {
  21.                 for(int i : arr){
  22.                         System.out.print(i+"\t");
  23.                 }
  24.                
  25.         }

  26.         //一趟快速排序,并返回用于下次分组的中间值i
  27.         public static int onceSort(int[]arr,int begin,int end){
  28.                 int i = begin;
  29.                 int j = end;
  30.                 int key = arr[i];
  31.                
  32.                 while(j>i){
  33.                         while(arr[j]>key&&j>i){
  34.                                 j--;
  35.                         }
  36.                         if(j>i){
  37.                                 arr[i] = arr[j];
  38.                                 arr[j] = key;
  39.                         }
  40.                         while(arr[i]<key&&j>i){
  41.                                 i++;
  42.                         }
  43.                         if(j>i){
  44.                                 arr[j] = arr[i];
  45.                                 arr[i] = key;
  46.                         }
  47.                 }
  48.                
  49.                 return i;
  50.         }
  51. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2