| 本帖最后由 PDH 于 2015-6-30 23:36 编辑 
 复制代码/**
 * 
 */
package com.heimablog;
/**
 * 快速排序算法详解:
 *            优点:快速算法是对冒泡排序的一种改进,在所有同数量级O(n log^n)的排序方法中
 *                    ,其平均性能最好。就平均时间而言,是目前被认为最好的内部排序方法之一。
 *   基本思想:使用的是递归原理。每次递归实现小于参考值的都在左边(右边),大于参
 *         考值的都在右边(左边)。多次递归直到脚标下界>=脚标上界。
 *   具体实现:1、写排序函数设定初始参考值,左边的数依次和参考值比较,如果大于
 *               参考值,则记录下来;右边的值和参考值比较,如果小于参考值,也记
 *               录下来,然后交换这两个值。再次循环,把小于参考值的都放在左边,
 *               大于参考值的都放在右边。
 *            2、对左边的再次进行递归排序,对右边的再次进行递归排序。直至所有顺
 *               序正确。
 *   注意事项:1、通过指针,记录异常值(在左边大于参考值的值和在右边小于参考值的
 *               值),然后第一个左边的异常值和(倒着的)第一个右边的异常值元素互
 *               换。依次往中间循环实现第一次排序。
 *                     2、排序函数返回的值应该是参考值应该在的位置的指针。                
 * 
 * 感觉有点说多了,具体看代码,就明白了。                
 * @author PDH
 *
 */
public class QSort {
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                QuickSort qs=new QuickSort();
                int data[]={45,5,2,89,12,89,54,3,11,64,0};
                qs.data=data;
                qs.sort(0, qs.data.length-1);
                qs.display();
        }
}
//实现快速算法的类
class QuickSort{
//        把数组定义成自己的成员变量,便于工具类的使用
        public int data[];
        
//        此方法完成从左到参考值和从最右边到参考值的一次排序
        private int partition(int sortArray[],int low,int hight){
//                定义参考值
                int key=sortArray[low];
//                循环排序实现,小于参考值的在左边,大于参考值的在右边
                while(low<hight){
//                        检查右边小于参考值的值,存在则放到左边
                        while(low<hight && sortArray[hight]>=key)
                                hight--;   //右指针--
//                        如果出现参考值右边的值小于了参考值,则把右异常值赋给sortArray[low],即把右边小于参考值的值放到左边
                        sortArray[low]=sortArray[hight];
                        
//                        检查左边大于参考值的值,存在则放到右边
                        while(low<hight && sortArray[low]<=key)
                                low++;   //左指针++
//                        如果出现参考值左边的值大于参考值,则把左异常值赋给sortArray[hight] 
                        sortArray[hight]=sortArray[low];
                        
                        /*这里有人会问,这样替换不是出现了覆盖了吗,原先的值不是被覆盖掉了吗
                        其实不会,是由于第一次把参考值赋值给了key,也就出现一个重复值,这样每次都可以
                        覆盖掉这个重复值*/
                }
//                一次循环完毕了,把key值赋值给low=hight的位置,也就完成了左右两边相对参考值的有序
                sortArray[low]=key;
//                返回low,即下一个递归的参考值
                return low;
                
        }
        
//        递归循环排序方法
        public void sort(int low,int hight){
                if(low<hight){
                        int result=partition(data,low,hight);
//                        递归左边
                        sort(low,result-1);
//                        递归右边
                        sort(result+1,hight);
                }
                
                
        }
        
//        打印数组方法
        public void display(){
                System.out.print("[");
                for(int i=0;i<data.length;i++){
                        if(i==data.length-1)
                                System.out.print(data[i]+"]");
                        else
                                System.out.print(data[i]+",");
                }
        }
}
 
 |