快排

作者: 崔鹏宇 | 来源:发表于2019-07-26 23:08 被阅读4次

Github
单边循环法

public class 快排 {
    public static void main(String[] args) {

        int[] arrays = {8, 0, 9, 10, 8, 4, 11, 34, 1};
        sort(arrays, 0, arrays.length - 1);
        System.out.println(Arrays.toString(arrays));
    }

    public static void sort(int[] arrays, int startIndex, int endIndex) {
        if (startIndex >= endIndex) {
            return;
        }
        //基准数指针位置
        int prvotIndex = partition(arrays, startIndex, endIndex);

        //除基准数外  左右两边再次进行 交换排序
        sort(arrays, startIndex, prvotIndex - 1);

        sort(arrays, prvotIndex + 1, endIndex);
    }

    public static int partition(int[] arrays, int startIndex, int endIndex) {
        //基准数
        int pivot = arrays[startIndex];
        //基准数指针位置
        int mark = startIndex;
        //先不交换基准数位置 ,只记录基准数指针位置  结束循环后再交换
        for (int i = startIndex + 1; i <= endIndex; i++) {

            //如果下一个数小于基准数
            if (pivot > arrays[i]) {
                //指针右移并交换数据
                mark++;
                System.out.println("交换前" + Arrays.toString(arrays));
                //如果 两数不相等 在进行交换
                if (arrays[mark] != arrays[i]) {
                    int temp = arrays[mark];
                    arrays[mark] = arrays[i];
                    arrays[i] = temp;
                    System.out.println("交换后" + Arrays.toString(arrays));
                }

            }
        }
        //基准数交换到基准数指针位置
        arrays[startIndex] = arrays[mark];
        arrays[mark] = pivot;
        System.out.println();
        System.out.println("交换基准数" + Arrays.toString(arrays));
        System.out.println();
        return mark;

    }
}

双边循环

    /**
     * 双边循环
     *
     * @param array
     * @param startIndex
     * @param endIndex
     */
    public static void DoubleSort(int[] array, int startIndex, int endIndex) {
        if (startIndex >= endIndex) {
            return;
        }

        //找到基准数位置
        int pivotIndex = DoublePartition(array, startIndex, endIndex);
        //除基准数外  左右两边再次进行 交换排序
        DoubleSort(array, startIndex, pivotIndex - 1);
        DoubleSort(array, pivotIndex + 1, endIndex);

    }

    public static int DoublePartition(int[] array, int startIndex, int endIndex) {
        //基准元素位置
        int pivot = array[startIndex];
        //左边指针位置
        int leftIndex = startIndex;
        //右边指针位置
        int rightIndex = endIndex;
        //两边指针重合结束循环
        while (leftIndex != rightIndex) {
            //若果左边比右边小   并且  右指针数大于基准数 右指针左移一位继续比较左边数  否则停止
            while (leftIndex < rightIndex && array[rightIndex] > pivot) {
                rightIndex--;

            }
            //同上 只不过是左指针右移
            while (leftIndex < rightIndex && array[leftIndex] <= pivot) {
                leftIndex++;
            }
            //如果左比有小 交换俩指针数位置
            if (leftIndex < rightIndex) {
                int p = array[leftIndex];
                array[leftIndex] = array[rightIndex];
                array[rightIndex] = p;
//                System.out.println("array = [" + Arrays.toString(array) + "], startIndex = [" + leftIndex + "], endIndex = [" + rightIndex + "]");
            }
        }
        //指针重合  和起始位置基准数交换重合位置
        array[startIndex] = array[leftIndex];
        array[leftIndex] = pivot;
        return leftIndex;
        
    }

相关文章

  • 快排

    快排代码

  • 快排

  • 快排

    昨天晚上睡觉前兴起准备十分钟写出快排,结果纠结了两个小时愣是没有搞出来,很郁闷地睡觉去。今天地铁上跟LG又重新缕了...

  • 快排

    基本思想: 先从数列中取出一个数作为基准数。 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的...

  • 快排

  • 快排

    python实现 java实现:

  • 快排

    快速排序: 基本思想:1、先从数列中取出一个数作为基数。2、分区,将比此基数大的数放到它右边,小的数放到它左边。3...

  • 快排

    package sort;import java.util.Arrays;public class Quickso...

  • 快排

  • 快排

    一、(1)假如有一个数组 [8,10,2,3,6,1,5] ,我们拿出5作为参考,将小于5的数放到它的左边,大于5...

网友评论

    本文标题:快排

    本文链接:https://www.haomeiwen.com/subject/ihijrctx.html