快排

17 阅读2分钟

快速排序是一种高效的排序算法,它使用分治法策略把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 代码有三个主要部分:主函数 main、快速排序函数 quickSort 和划分函数 partition

main 函数中,创建了一个未排序的整数数组作为测试数据,然后调用 quickSort 函数对数组进行排序。排序后,main 函数会打印出数组中的每个元素。

quickSort 函数是快速排序的核心。它首先检查数组的长度,如果长度小于等于 1,则函数返回,因为不需要排序。否则,通过评估数组中随机选择的一个元素作为 pivot(在代码中通过调用 swap 函数实现),将数组分成两部分:小于等于 pivot 的元素和大于 pivot 的元素。然后,quickSort 函数递归地对这两部分进行排序。

partition 函数负责将数组划分为两部分:小于等于 pivot 的元素和大于 pivot 的元素。它使用三个指针:p1p2p3p1 指向小于等于 pivot 部分的最后一个元素,p2 用于遍历数组,p3 指向大于 pivot 部分的第一个元素。p2 从数组的最左边开始遍历,直到它到达 p3 的位置。在遍历过程中,partition 函数根据 p2 指向的元素和 pivot 的比较结果,决定是将 p2 指向的元素交换到左边还是右边。

swap 函数是一个辅助函数,用于交换数组中的两个元素。它通过临时变量 temp 来实现两个元素的交换。

public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {4, 11, 44, 34, 8, 2, 1, 77, 49};
        quickSort(arr, 0, arr.length - 1);
        for (int i : arr) {
            System.out.printf("%d ", i);
        }

    }

    public static void quickSort(int[] a, int l, int r) {
        if (l >= r) {
            return;
        }
        swap(a, l + (int) (Math.random() * (r-l + 1)), r);
        int[] p = partition(a, l, r);
        quickSort(a, l, p[0] - 1);
        quickSort(a, p[1] + 1, r);
    }

    public static int[] partition(int[] a, int l, int r) {

        if (l == r) {
            return new int[]{l, r};

        }
        int p1 = l - 1;
        int p2 = l;
        int p3 = r;

        while (p2 < p3) {
            if (a[p2] == a[r]) {
                p2++;

            } else if (a[p2] < a[r]) {
                swap(a, p2++, ++p1);

            } else {
                swap(a, p2, --p3);
            }
        }
        swap(a, p3, r);
        return new int[]{p1 + 1, p3};


    }

    public static void swap(int[] arr, int i, int j) {

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }


}