QuickSort

发布时间 2023-03-27 22:54:17作者: lipin
package Sort;
/**
 * 复杂度:最坏情况下:O(n^2),像冒泡一样,每次比较都需要替换,但这种情况并不常见。平均复杂度是 O(nlogn)
 * 稳定性定义:数组arr中有若干元素,其中A元素和B元素相等。并且A元素在B元素前面,如果使用某种排序算法排序后,
 *           能够保证A元素依然在B元素的前面,可以说这个该算法是稳定的。
 *
 * */

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

    }

    public static void quickSort(int arr[], int begin, int end) {
        if (begin < end) { // 至少有两个以上的元素
            int base = arr[begin]; // 设置第一个数为基准
            int i = begin;
            int j = end;
            while (i < j) {
                while (i < j && arr[j] >= base) { // 从右往左找比base小的
                    j--;
                    // 为什么每次都需要j先移动,因为当最后i和j相碰时,此时所指向的是j寻找到比基准值小的数字,然后和基准值交换能确保基准值左边的都是小于基准值的数字,
                    // 但是如果i先右边移动的话,最后i和j相碰时,i和j所指向的是i寻找得比基准值大的数,此时和基准值相交换,基准值左边是有一个比基准值大的数,没有达到我们需要的排序效果。
                }
                arr[i] = arr[j]; // 找到后,将比基准小的和左边比基准大的进行替换
                while (i < j && arr[i] <= base) { // 然后从左往右找比base大的
                    i++;
                }
                arr[j] = arr[i]; // 找到后进行替换
            }
            arr[i] = base;  // 当两个指针相等时,就是基准的位置
            quickSort(arr, begin, i - 1);
            quickSort(arr, i + 1, end);
        } else {
            return;
        }
    }


}