快速排序--算法快速排序

介绍
快速排序(Quicksort)是一种基于分治策略的高效排序算法

基本思想:是选择一个“基准”元素(pivot),然后将数组分成两部分:一部分的所有元素都小于等于基准,另一部分的所有元素都大于基准。这个过程被称为分区操作(partition)。接下来,递归地对这两部分进行相同的操作,直到整个数组有序。

⏩步骤:

选择基准:从数组中选择一个元素作为基准。这可以是数组中的第一个元素、最后一个元素、中间元素,或者是随机选择的元素。

分区操作:重新排列数组,使得所有比基准小的元素放在基准前面,所有比基准大的元素放在基准后面(相等的元素可以在任一边)。在这个分区结束之后,该基准就处于其最终的位置。

递归排序子数组:递归地将较小元素的子数组和较大元素的子数组排序。

public static int partition(int[] array, int low, int high) {
    // 选择最后一个数作为基准
    int pivot = array[high];
    
    // 定义了一个pointer变量,它指向分区后应该放置小于等于pivot值的位置,初始为low
    int pointer = low;
    
    // 从 low 开始遍历到 high - 1, 如果当前元素小于或等于pivot,则将该元素与pointer位置的元素互换,并将pointer向前移动一位。
    // 这一步确保了所有小于等于pivot的元素都被移到了pointer左侧。
    for (int i = low; i < high; i++) {
        if (array[i] <= pivot) {
            int temp = array[i];
            array[i] = array[pointer];
            array[pointer] = temp;
            pointer++;
        }
        System.out.println(Arrays.toString(array));
    }

    // 遍历完后pointer左边的都是小于等于pivot,右边的(包括pointer)都是大于pivot,此时应该将pivot和pointer交换,使得pivot移到正确位置
    int temp = array[pointer];
    array[pointer] = array[high];
    array[high] = temp;
    return pointer;
}
public static void quickSort(int[] array, int low, int high) {
    if (low < high) {
        int position = partition(array, low, high);
        quickSort(array, low, position - 1);
        quickSort(array, position + 1, high);
    }
}

算法分析:

稳定性:不稳定

时间复杂度

最佳:O(nlogn)

最差:O(n2):这种情况发生在每次选择的基准都是当前数组的最大或最小值,导致每次分区后只减少一个元素。这通常会在已经排序好的数组上发生,如果总是选择第一个或最后一个元素作为基准。

平均:O(nlogn)

空间复杂度:O(logn)

实现图解🖌️
1. 选择基准
选择最后一个数作为基准
定义了一个pointer变量,它指向分区后应该放置小于等于pivot值的位置,初始为low(指向数组最左边位置)
)

2. 遍历重排元素
从 low 开始遍历到 high - 1, 如果当前元素小于或等于pivot,则将该元素与pointer位置的元素互换,并将pointer向前移动一位。
这一步确保了所有小于等于pivot的元素都被移到了pointer左侧。
)

2.1. 遍历步骤

3. 将pivot置于中间
遍历完后pointer左边的都是小于等于pivot,右边的(包括pointer)都是大于pivot,此时应该将pivot和pointer交换,使得pivot移到正确位置

4. 使用递归划分子数组

public static void quickSort(int[] array, int low, int high) {
    if (low < high) {
        int position = partition(array, low, high);
        quickSort(array, low, position - 1);
        quickSort(array, position + 1, high);
    }
}


类似二分法,position即得到的pivot所在位置,用同样的方法去递归排序[low,position-1]和[position+1,high]直到每个子数组只有一个元素(即low=high)

为了更加清晰的图解,假如第一次partition操作后的排序为[1, 0, 1, 2, 4, 5, 7, 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值