当前位置 : 主页 > 编程语言 > c++ >

java实现快速排序算法

来源:互联网 收集:自由互联 发布时间:2021-06-30
java实现快速排序算法 csdn详细文章解读:http://blog.csdn.net/maoyuanming0806/article/details/78167041代码: public class SortTest { /** *title:main *@param args */ public static void main(String[] args) { /* * 获得随机8个
java实现快速排序算法
csdn详细文章解读:http://blog.csdn.net/maoyuanming0806/article/details/78167041

代码:
    public class SortTest {  
      
        /** 
         *title:main 
         *@param args 
         */  
        public static void main(String[] args) {  
              
            /* 
             * 获得随机8个0到99之间数的数组  
             */  
            int[] arr = new int[8];  
            for(int i = 0;i < 8;i++){  
                arr[i] = (int) (Math.random() * 99);  
            }  
              
              
            //排序前的输出  
            for(int a:arr){  
                System.out.print(a+" ");  
            }  
            System.out.println();  
              
            quickSort(arr,0,arr.length - 1);  
            //System.out.println("划分后关键字的位置:"+division(arr, 0, arr.length - 1));  
              
            //排序后的输出  
            for(int a:arr){  
                System.out.print(a+" ");  
            }  
              
        }  
          
          
          
        //=======================QUICK SORT=============================================================================  
        //首先对当前需要快速排序的序列进行一次快排,最后基数的左边全是小的,右边全是大的  
        //关键步骤:设置关键字、划分、递归  
        /** 
         * 快速扫描,划分数组 
         *title:division 
         *@param arr 要排序的数组 
         *@param left 左边界,边界指的是扫描指针的起始位置 
         *@param right 右边界 
         *@return 返回本轮扫描后关键字的位置,方便得到子数组的边界位置 
         */  
        public static int division(int[] arr,int left,int right){  
              
            int point = right;      //选取最右边数为关键字  
              
            /* 
             * 这里为了减少语句,就先设置左边扫描起点-1,右边扫描起点+1, 
             * 这里由于选取的是最右边的数为关键字,所以右边扫描就是从right-1开始,所以就不需要再减 
             */  
            int leftPre = left - 1;  
            int rightPre = right;  
              
            //让它一直扫描,进行划分  
            while(true){  
                /* 
                 * 从左往右扫描,比关键字小就继续扫描,若找到了比关键字大的当前 
                 * 扫描就先停下来,等待交换。这也就是把比关键字小的放在关键字左边 
                 */  
                while(leftPre < rightPre && arr[++leftPre] < arr[point]);  
                  
                /* 
                 * 从右往左扫描,比关键字大就继续扫描,若找到了比关键字小的当前 
                 * 扫描就先停下来,等待交换。这也就是把比关键字大的放在关键字右边 
                 */  
                while(leftPre < rightPre && arr[--rightPre] > arr[point]);  
                  
                //当两个扫描停下来了,如果是leftPre >= rightPre则本轮扫描结束,否则就是需要交换位置了  
                if(leftPre >= rightPre){  
                    break;  
                }else{  
                    //如果是等待交换(左扫描找到了比关键字大的或右扫描找到了比关键字小的)那么就交换  
                    int temp = arr[leftPre];  
                    arr[leftPre] = arr[rightPre];  
                    arr[rightPre] = temp;  
                }  
                  
            }  
              
            /* 
             * 本轮扫描划分结束,那么关键字就应该出于中间位置,由于选取的是最右边的数做关键字, 
             * 那么和右边的比关键字大的数组的第一个位置交换即可,也就是和leftPre所在位置的值交换 
             */  
            int temp = arr[leftPre];  
            arr[leftPre] = arr[point];  
            arr[point] = temp;  
              
            //返回本轮划分的划分点,也就是关键字交换后所在的中间位置  
            return leftPre;  
              
        }  
          
          
        /** 
         * 递归完成快速排序:左边界至右边界之间的数 构成子数组,进行子数组的快速排序 
         *title:quickSort 
         *@param arr 需要排序的数组 
         *@param left 当前排序的左边界 
         *@param right 当前排序的右边界 
         */  
        public static void quickSort(int[] arr,int left,int right){  
            //递归划分,完成排序,递归的出口就是当left>=right时,也就时排序完成了  
            if(left >= right){  
                return;  
            }else{  
                int pointPosition = division(arr,left,right);  
                  
                //对划分后关键字左边的数进行排序  
                quickSort(arr, left, pointPosition - 1);  
                  
                //对划分后关键字右边的数进行排序  
                quickSort(arr, pointPosition + 1, right);  
            }     
              
        }  
        //==========================QUICK SORT 完======================================================================================  
    }  



上方代码一次执行结果:
3 30 52 34 98 54 79 50 
3 30 34 50 52 54 79 98 

完美排序
网友评论