交换类排序——快速排序

快速排序是从序列中选择一个比较对象,然后其他的元素与它比较分成两组,按照相同的方法在两组中以此划分,直到以两个数为一组。就像递归函数一样。

//快速排序
public class  QuickSort
{
    public void quickSort(int[] r,int low,int high)
    {
        if(low<high)
        {
            int pa=partition(r,low,high);
            if(pa-1>low)            
                quickSort(r,low,pa-1);//将pa左边的序列排序
            if(pa+1<high) 
                quickSort(r,pa+1,high);//将pa右边的序列排序
        }
    }
    private int partition(int[] r,int low,int high)
    {
        int privot=r[low];//选择比较对象,选择的对象直接影响到排序的效率,以中间数最好
        while(low<high)
        {
            while(low<high && r[high]>=privot)//从右边向左扫描,找到第一个比privot小的数向前移,否则元素不动指针前移
                high--;
            if(low<high)
                r[low]=r[high];
            while(low<high && r[low]<=privot)//从左向右移……
                low++;
            if(low<high)
                r[high]=r[low];            
        }
        r[low]=privot;//中间数填回最后移动的位置
        return low;
    }
    public static void main(String[] args) 
    {
        QuickSort b=new QuickSort();
        int[] a={4,8,3,6,9,7,5,2,1};
        b.quickSort(a,0,8);
        for(int i=0;i<a.length;i++) 
            System.out.println(a[i]);
    }
}

影响快速排序效率的是比较元素的选择问题如果每次分组后,两个组的元素个数差不多,效果最好。因此选择比较对象元素师关键。

posted @ 2013-10-27 10:39  JMSXH  阅读(151)  评论(0编辑  收藏  举报