快速排序--Java实现

package com.shusheng.quickSort;

/** * 快排(画图分析) * @author Administrator */
public class QuickSort {

    /** * 快排的public方法 * @param array 需要快排的数组 * @param low * @param high */
    public static void quickSort(int[] array,int low,int high){
        if(low>=high) return;//如果low>=high,就不用再排序了,因为low=high时待排序列就只有一个元素了,这个条件也是迭代结束条件
        int parentLow = low; //记录待排区间的最低位置,下面递归要用
        int parentHigh = high;//记录待排区间的最高位置,下面递归要用
        int pivotKey = array[low];//中枢,就是将待排序列分成两半的中轴
        //必须保证低位指针不超过高位指针,如果low>=high,说明已经成功将待排序列分成两半了
        while(low<high){

            //当array[high]大于中轴,就让high继续向low方向移动,直到low与high相等或找到一个比中轴小的数
            while(low<high&&array[high]>pivotKey) {high--;}
            //如果low<high,说明上面找到了比中轴小的数,就应该将该数放到low端
            if(low<high)
                array[low++] = array[high];//将该数放入到low的位置,然后low位置向high方向移动一位(作图分析)

            //当low<high且low指向的值小于中轴,就让low向high方向移动,直到找到一个比中轴大的数或者直到low>=high
            while(low<high&&array[low]<pivotKey) {low++;}
            //如果low<high,说明上面找到了比中轴大的数,就应该放在high端
            if(low<high)
                array[high--] = array[low];//将比中轴大的数放入high的位置,然后high向low位置移动一位
        }

        //当上面while循环结束时,说明low=high,说明已经成功将待排序列分成两半,这个时候需要将中轴的值移到待排序列的中间位置
        array[low] = pivotKey;
        //递归
        quickSort(array, parentLow, low-1);//上面将待排序列一分为二后,这里再将前半部分(即parentLow到中轴)进行递归
        quickSort(array, low+1, parentHigh);//将后半部分(即中轴到parentHigh)进行递归
    }

    /** * 测试方法 * @param args */
    public static void main(String[] args) {
        int[] args1 = {12,53,48,26,42,62,46,45};
        quickSort(args1,0,args1.length-1);
        for (int i = 0; i < args1.length; i++) {
            System.out.println(args1[i]);
        }
    }

}

有问题欢迎交流。

你可能感兴趣的:(快速排序,java快速排序,Java快排)