快速排序法实现

  • Post author:
  • Post category:其他


public class QuickSort {
    public static void main(String[] args) {
        Integer[] arrys = new Integer[]{13,11,10,3, 7, 1,14,1, 2, 6, 5, 4,9,12};
        sort(arrys, 0, arrys.length - 1);

        System.out.println(Arrays.asList(arrys));
    }

    /**
     * 排序
     * @param arrys 待排序数组 begin-end之间就是需要排序的片段
     * @param begin 数组需要排序的开始下标
     * @param end 数组需要排序的结束下标
     */
    public static void sort(Integer[] arrys, int begin, int end) {
        //如果需要排序的片段元素数量已经小于1,则不用排序
        if (begin >= end) {
            return;
        }
        //以begin作为分界值,排序比较并返回分界值最终所在的位置
        int position = compareReplace(arrys, begin, end);
        //以分界值为界,begin--分界值之间的片段重复排序操作
        int leftBegin = begin;
        int leftEnd = position - 1;
        //以分界值为界,分界值--end之间的片段重复排序操作
        int rightBegin = position + 1;
        int rightEnd = end;
        //分界值左边的片段做一次排序
        sort(arrys, leftBegin, leftEnd);
        //分界值右边的片段做一次排序
        sort(arrys, rightBegin, rightEnd);
    }

    /**
     * 比较替换 begin-end这一段数组做快速排序 以begin作为分界值进行比较
     * @param arrys
     * @param begin
     * @param end
     * @return 返回分界值最终的位置
     */
    public static int compareReplace(Integer[] arrys, int begin, int end) {
        //1-表示从右往左遍历 2-表示从左往右遍历
        int mod = 1;
        //以begin作为分界值
        while (begin != end) {
            if (arrys[begin] <= arrys[end]) {
                if (mod == 1) {
                    end--;
                }
                if (mod == 2) {
                    begin++;
                }
            }
            if (arrys[begin] > arrys[end]) {
                Integer temp = arrys[begin];
                arrys[begin] = arrys[end];
                arrys[end] = temp;
                //如果是从右往左遍历找到了比分界值小的值,则将分界值和这个值做一次位置替换,并切换遍历方式为从左往右遍历
                if (mod == 1) {
                    mod = 2;
                }
                //如果是从左往右遍历找到了比分界值小的值,则将分界值和这个值做一次位置替换,并切换遍历方式为从右往左遍历
                else {
                    mod = 1;
                }
            }
        }
        return begin;
    }
}

运行结果:



版权声明:本文为xiaxiaoying2012原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。