一、基本思想

  快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选用序列第一个元素作为基准值,由序列的最后一个元素从后往前扫描序列,找到一个元素值小于基准值,就将这二个值交换,然后由序列的第一个元素从前向后扫描序列,找到一个元素大于基准值,然后交换这二个值,直到从前到后的扫描索引大于等于从后到前的扫描索引。这时基准数的左边小于基准数,右边大于基准数。然后按照上述方式递归基准数左右二边的子序列,直到子序列大小为1或0,整个序列就有序了。快速排序的平均空间复杂度为O(nlog2n),时间空间度为O(1),快速排序是不稳定的排序。

二、图解

java 实现快速排序 java快速排序_子序列

三、代码实现

public class JavaSort {
    public static void main(String[] args) {
        int a [] =new int []{3,1,5,2,4};
        System.out.println("排序前的数组:"+Arrays.toString(a));
        fastSort(a, 0, a.length-1);
        
        System.out.println("排序后的数组:"+Arrays.toString(a));
    }
    
    /**
     * 
     * @param ary 未排序数组
     * @param before (子)序列最前面的索引
     * @param after  (子)序列最后面的索引
     */
     public static void fastSort(int[] ary,int before,int after ) {
         int begin = before;
         int end = after ;
         int key = ary[before];
         while(end>begin){
             //从后往前比较
             while(end>begin&&ary[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
                 end--;
             if(ary[end]<=key){
                 int temp = ary[end];
                 ary[end] = ary[begin];
                 ary[begin] = temp;
             }
             //从前往后比较
             while(end>begin&&ary[begin]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
                begin++;
             if(ary[begin]>=key){
                 int temp = ary[begin];
                 ary[begin] = ary[end];
                 ary[end] = temp;
             }
         }
         //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用

         //递归关键值左右二边的子序列
         if(begin>before) {
             fastSort(ary,before,begin-1);//递归左边子序列。

         }
         if(end<after ) {
             fastSort(ary,end+1,after );//递归右边子序列。
         }
     }
}

运行结果:

java 实现快速排序 java快速排序_递归_02