补充 || 快速排序

本文详细介绍了快速排序作为冒泡排序优化的原理,强调了其跳跃式交换的特点,使得平均时间复杂度降低到O(nlog²n)。通过示例解释了快速排序的双指针探测过程,以及如何通过递归实现排序。在最坏情况下,两者时间复杂度相同为O(n²)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序其实是冒泡排序的一种改进,冒泡排序每次对相邻的两个数进行比较,这显然是一种比较浪费时间的。

快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的。

在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是  O(n^2),它的平均时间复杂度为 O ( n log ⁡ 2 n ) 。
 

快速排序是分别从两端开始”探测”的,刚开始的时候让哨兵 i 指向序列的最左边,让哨兵 j 指向序列的最右边。

首先哨兵 j 开始出动。

因为此处设置的基准数是最左边的数,所以需要让哨兵 j先出动,这一点非常重要。哨兵 j 一步一步地向左挪动(即 j = j − 1 ),直到找到一个小于基准的数停下来。接下来哨兵 i 再一步一步向右挪动(即 i = i + 1 ),直到找到一个数大于基准的数停下来。
现在交换哨兵i和哨兵j所指向的元素的值。

到此,第一次交换结束。

接下来开始哨兵 j 继续向左挪动(再友情提醒,每次必须是哨兵j先出发),哨兵 i 也继续向右挪动的。重复上述操作,交换等。

当哨兵 i 和哨兵 j 相遇,哨兵 i 和哨兵 j 都走到数x面前。说明此时“探测”结束。

若x小于基准数,将x和基准数进行交换。若x大于基准数,则不换。

重复第一轮的过程。快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。

void Quick_Sort(int *arr, int begin, int end){
    if(begin >= end)
        return;

    int tmp = arr[begin];

    int i = begin;
    int j = end;

    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }

    arr[begin] = arr[i];
    arr[i] = tmp;

    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值