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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 PDH 于 2015-6-30 23:36 编辑
  1. /**
  2. *
  3. */
  4. package com.heimablog;

  5. /**
  6. * 快速排序算法详解:
  7. *            优点:快速算法是对冒泡排序的一种改进,在所有同数量级O(n log^n)的排序方法中
  8. *                    ,其平均性能最好。就平均时间而言,是目前被认为最好的内部排序方法之一。
  9. *   基本思想:使用的是递归原理。每次递归实现小于参考值的都在左边(右边),大于参
  10. *         考值的都在右边(左边)。多次递归直到脚标下界>=脚标上界。
  11. *   具体实现:1、写排序函数设定初始参考值,左边的数依次和参考值比较,如果大于
  12. *               参考值,则记录下来;右边的值和参考值比较,如果小于参考值,也记
  13. *               录下来,然后交换这两个值。再次循环,把小于参考值的都放在左边,
  14. *               大于参考值的都放在右边。
  15. *            2、对左边的再次进行递归排序,对右边的再次进行递归排序。直至所有顺
  16. *               序正确。
  17. *   注意事项:1、通过指针,记录异常值(在左边大于参考值的值和在右边小于参考值的
  18. *               值),然后第一个左边的异常值和(倒着的)第一个右边的异常值元素互
  19. *               换。依次往中间循环实现第一次排序。
  20. *                     2、排序函数返回的值应该是参考值应该在的位置的指针。               
  21. *
  22. * 感觉有点说多了,具体看代码,就明白了。               
  23. * @author PDH
  24. *
  25. */
  26. public class QSort {

  27.         /**
  28.          * @param args
  29.          */
  30.         public static void main(String[] args) {
  31.                 // TODO Auto-generated method stub
  32.                 QuickSort qs=new QuickSort();
  33.                 int data[]={45,5,2,89,12,89,54,3,11,64,0};
  34.                 qs.data=data;
  35.                 qs.sort(0, qs.data.length-1);
  36.                 qs.display();
  37.         }

  38. }

  39. //实现快速算法的类
  40. class QuickSort{
  41. //        把数组定义成自己的成员变量,便于工具类的使用
  42.         public int data[];
  43.        
  44. //        此方法完成从左到参考值和从最右边到参考值的一次排序
  45.         private int partition(int sortArray[],int low,int hight){
  46. //                定义参考值
  47.                 int key=sortArray[low];
  48. //                循环排序实现,小于参考值的在左边,大于参考值的在右边
  49.                 while(low<hight){
  50. //                        检查右边小于参考值的值,存在则放到左边
  51.                         while(low<hight && sortArray[hight]>=key)
  52.                                 hight--;   //右指针--
  53. //                        如果出现参考值右边的值小于了参考值,则把右异常值赋给sortArray[low],即把右边小于参考值的值放到左边
  54.                         sortArray[low]=sortArray[hight];
  55.                        
  56. //                        检查左边大于参考值的值,存在则放到右边
  57.                         while(low<hight && sortArray[low]<=key)
  58.                                 low++;   //左指针++
  59. //                        如果出现参考值左边的值大于参考值,则把左异常值赋给sortArray[hight]
  60.                         sortArray[hight]=sortArray[low];
  61.                        
  62.                         /*这里有人会问,这样替换不是出现了覆盖了吗,原先的值不是被覆盖掉了吗
  63.                         其实不会,是由于第一次把参考值赋值给了key,也就出现一个重复值,这样每次都可以
  64.                         覆盖掉这个重复值*/
  65.                 }
  66. //                一次循环完毕了,把key值赋值给low=hight的位置,也就完成了左右两边相对参考值的有序
  67.                 sortArray[low]=key;
  68. //                返回low,即下一个递归的参考值
  69.                 return low;
  70.                
  71.         }
  72.        
  73. //        递归循环排序方法
  74.         public void sort(int low,int hight){
  75.                 if(low<hight){
  76.                         int result=partition(data,low,hight);
  77. //                        递归左边
  78.                         sort(low,result-1);
  79. //                        递归右边
  80.                         sort(result+1,hight);
  81.                 }
  82.                
  83.                
  84.         }
  85.        
  86. //        打印数组方法
  87.         public void display(){
  88.                 System.out.print("[");
  89.                 for(int i=0;i<data.length;i++){
  90.                         if(i==data.length-1)
  91.                                 System.out.print(data[i]+"]");
  92.                         else
  93.                                 System.out.print(data[i]+",");
  94.                 }
  95.         }
  96. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

3 个回复

倒序浏览
第一次发帖多多指教
回复 使用道具 举报
不错,收藏了
回复 使用道具 举报
各位,本人最近在报考黑马,走流程,如果有哪位好心人,施舍点分,不盛感激
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马