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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小车车 中级黑马   /  2015-6-10 20:55  /  319 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*快速排序基本思想;使用快速排序方法对a[0,n-1]排序,从a[0,n-1]中排序选择一个元素作为Middle,该元素为中点(支点),把剩余的元素分割为两段--left和right。。
  2. */
  3. class Sample5{
  4.         private double[] theArry;//对象私有属性
  5.         private int nElems;//记录数组长度
  6.         //----------------------------------
  7.         public Sample5(int max){//构造函数
  8.                 theArry =new double[max];//创建数组
  9.                 nElems=0;//开始数组长度为0
  10.                
  11.         }
  12.         //------------------------------
  13.         public void insert(double value){//将元素插入数组
  14.         theArry[nElems]=value;
  15.         nElems++;
  16.                
  17.         }
  18.         //------------------------------------
  19.         public void dispaly(){//打印数组
  20.         System.out.print("A=");
  21.         for(int j=0;j<nElems;j++)
  22.                 System.out.print(theArry[j]+" ");
  23.         System.out.print(" ");
  24.                        
  25.         }
  26.         //------------------------------------------
  27.         public void quickSort(){//执行快速排序算法
  28.                 recQuickSort(0,nElems-1);
  29.         }
  30.         //快速算法核心部分,设定左下标和右下标
  31.         public void recQuickSort(int left,int right){
  32.                 if(right-left<=0)
  33.                         //若right<=left .表明排序结束
  34.                 return;
  35.                 else
  36.                 {
  37.                         double pivot=theArry[right];//获取最右元素值
  38.                         //以最右的元素为轴,划分左右范围
  39.                         int partition =partitionIt(left,right,double pivot);
  40.                         recQuickSort(left,partition-1);//对partition左边的元素进行排序
  41.                         recQuickSort(partition+1,right);//对partition右边的元素进行排序               
  42.                        
  43.                 }
  44.         }
  45.         //总体思想:找到最左边pivot大的元素,最右边比pivot小的元素,交换这两个元素
  46.         //循环进行以上工作,直至左右下标重叠
  47.         public int partitionIt(int left,int right,double pivot){
  48.                 int leftPtr=left-1;
  49.                 int rightPtr=right;
  50.                 while(true){
  51.                         while(theArry[++leftPtr]<pivot)//找出pivot大的左边的元素
  52.                         ;
  53.                         //找出pivot小的右边的元素
  54.                         while(rightPtr>0&&theArry[--rightPtr]>pivot)
  55.                                 ;
  56.                         if(leftPtr>rightPtr)
  57.                                 //如果左下标大于右下标则结束
  58.                         break;
  59.                         else
  60.                                 swap(leftPtr,rightPtr);
  61.                         return leftPtr;
  62.                 }
  63.                
  64.         }
  65.         //----------------------------------------------------------------
  66.         public void swap(int dex1,int dex2){
  67.                 double temp=theArry[dex1];
  68.                 theArry[dex1]=theArry[dex2];
  69.                 theArry[dex2]=temp;
  70.         }
  71. }
  72. //对象QuickSortApp的声明如下所示
  73. public class QuickSortApp{
  74.         public static void main(String[] args){
  75.                 int maxSise=16;//数组长度
  76.                 Sample5 arr;//声明对象
  77.                 arr=new Sample5(maxSise);//利用构造函数创建数组
  78.                 for(int j=0;j<maxSise;j++){
  79.                         //利用Math函数random产生随机数,初始化数组
  80.                         double n=(int)(java.lang.Math.random()*99);
  81.                         arr.insert(arr);
  82.                        
  83.                 }
  84.                 arr.dispaly();
  85.                 arr.quickSort();
  86.                 arr.dispaly();
  87.         }
  88. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马