快排(冒泡升级版)

快速排序(快排)

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

/**
 * 快排
 *
 * @author lyn
 * @date 2022/3/3 10:09
 */
public class QuickSort {

    private static int count;
    private static int index;

    public static void main(String[] args) {
        int[] num = {1, 2, 5, 8, 56, 42, 43, 82, 33, 13, 19};
        printArrToStr(num, "排序前: ");
        //bubbleSort(num);
        quickSort(num, 0, num.length - 1);
        printArrToStr(num, "排序后: ");
        System.out.println("循环次数: " + count);
    }

    /**
     * 快排(冒泡的升级版)
     *
     * @param num   数组
     * @param left  左光标的索引
     * @param right 右光标的索引
     */
    public static void quickSort(int[] num, int left, int right) {
        //如果左光标left大于右光标,则停止
        if (left >= right) {
            return;
        }
        //记录最初的key
        int key = num[left];
        int i = left;
        int j = right;
        while (i < j) {
            //右光标左移,遇到比key小的停止
            while (num[j] >= key && i < j) {
                j--;
            }
            //左光标右移,遇到比key大的停止
            while (num[i] <= key && i < j) {
                i++;
            }
            //相互交换位置
            if (i < j) {
                int temp = num[i];
                num[i] = num[j];
                num[j] = temp;
            }
        }
        //更新key的值
        num[left] = num[i];
        num[i] = key;
        count++;
        //以i为界再进行两次排序
        quickSort(num, left, i - 1);
        quickSort(num, i + 1, right);
    }

    /**
     * 冒泡排序
     *
     * @param num 数组
     */
    public static void bubbleSort(int[] num) {
        int temp;
        for (int i = 0; i < num.length - 1; i++) {
            for (int j = 0; j < num.length - i - 1; j++) {
                index++;
                if (num[j] > num[j + 1]) {
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        }

    }

    /**
     * 打印数组
     *
     * @param num
     * @param text
     */
    public static void printArrToStr(int[] num, String text) {
        StringBuilder sbr = new StringBuilder(text);
        for (int i : num) {
            sbr.append(i).append("\t");
        }
        System.out.println(sbr.toString());
    }

}

参考文档地址: Java实现快速排序

讲解视频地址: 史上最详细的快速排序(快排)讲解 妈咪级快速排序讲解

posted @ 2022-03-02 23:35  进击的小蔡鸟  阅读(32)  评论(0编辑  收藏  举报