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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© niuapp 中级黑马   /  2015-5-18 23:38  /  841 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2.         目的:理解快速排序
  3.         思路:用前后索引的移动把目标元素放到数组中正确的位置,此位置前边的元素比目标小,后边的比目标大
  4.        
  5.         步骤:具体已转注释

  6.         sy 索引
  7.         kp 快排..

  8.         输出结果:
  9. ---------------------------------
  10. F:\MyCode\EditPlus_code>javac SortKPTest.java
  11. F:\MyCode\EditPlus_code>java SortKPTest
  12. -3  2  2  4  32  98
  13. -----------------------------------
  14. */

  15. public class SortKPTest {
  16.         //main
  17.         public static void main(String[] args) {
  18.                
  19.                 int[] arr = new int[]{2, 4, -3, 32, 98, 2};
  20.                
  21.                 SortKP kp = new SortKP();
  22.                 kp.kp(arr, 0, 5);                //对数组中0到5号元素进行排序;

  23.                                                        
  24.                 for(int x : arr) {                //遍历排序后的数组
  25.                         System.out.print(" "+x+" ");
  26.                 }
  27.                 System.out.println();
  28.         }
  29. }

  30. class SortKP{                //快速排序       
  31.         public int sy(int[] a, int i, int j) {       
  32.                
  33.                 int v = a[i];        //把索引为i的元素保存到v中,寻找元素v在整个数组中排序后的位置


  34.                 while(i<j) {                //只有当前索引小于后索引才进入循环
  35.                
  36.                         while(i<j && a[j]>=v) {

  37.                                 j--;
  38.                         }
  39.                         a[i] = a[j];        //i和j 是前索引和后索引,前索引不变,后索引对应的元素和需要找位置的元素 v 比较,
  40.                                                         //当发现 v 更小,就把后索引往前移,继续判断循环,
  41.                                                         //当发现 v 更大,把后索引元素放到前索引元素位置(上边前索引元素已经保存在v中),
  42.                                                         //此时,后索引 j所在的位置之后已经都比 v 大,往下走

  43.                         while(i<j && a[i]<=v) {
  44.                        
  45.                                 i++;
  46.                         }
  47.                         a[j] = a[i];        //同理,后索引不变,前索引对应的元素和需要找位置的元素 v 比较,
  48.                                                         //当发现 v 更大,就把前索引往后移,继续判断循环,
  49.                                                         //当发现 v 更小,把 前索引元素放到 后索引元素位置,
  50.                                                         //此时,后索引 i所在的位置之后已经都比 v 小,往下走
  51.                                                         //接着进入下一次外循环
  52.                 }

  53.                 a[i] = v;                        //直到当 前后索引的位置重合,此时这个索引指向的位置就是 V 的位置(前边比v小,后边比v大)
  54.                                                         //放到eclipse中通过断点查看此时的a[i]可知,v元素放到正确的位置
  55.                 //或是 a[j] = v;

  56.                 return i; //返回已经找到的元素的索引
  57.        
  58.         }

  59.         public void kp(int[] a, int i, int j) {
  60.                 int pos;        //创建一个记录位置的变量,用来记录上边 sy方法返回的位置,把数组分成前后两个部分继续排序

  61.                 if(i<j) {        //当前索引i和后索引j之间有元素,才进行判断

  62.                         pos = sy(a, i, j);        //返回一个排好元素的标号,把数组分成两半
  63.                         kp(a, pos+1, j);        //排数组后边的元素
  64.                         kp(a, i, pos-1);        //排数组前边的元素
  65.                 }
  66.         }
  67. }
复制代码

2 个回复

倒序浏览
哈哈哈,这么麻烦
回复 使用道具 举报
后面就看迷糊了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马