快速排序的时间复杂度和空间复杂度分析(图文结合)

文章详细分析了快速排序的平均时间复杂度(O(n*log2(n)))和空间复杂度(O(log2(n))),以及在最坏情况下的时间复杂度(O(n^2))和空间复杂度(O(n)),解释了分治策略和递归过程对效率的影响。

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

目录

一、平均时间复杂度以及对应的空间复杂度分析

时间复杂度:

空间复杂度:

二、最坏情况下的时间复杂度和空间复杂度

时间复杂度:

空间复杂度:


快速排序的代码

void QuickSort(int array[], int low, int high) {
    int i = low; 
    int j = high;
    if(i >= j) {
        return;
    }
 
    int temp = array[low];
    while(i != j) {
        while(array[j] >= temp && i < j) {
            j--;
        }
	while(array[i] <= temp && i < j) {
            i++;
        }
	if(i < j) {
            swap(array[i], array[j]);
        }
    }
 
    //将基准temp放于自己的位置,(第i个位置)
    swap(array[low], array[i]);
    QuickSort(array, low, i - 1);
    QuickSort(array, i + 1, high);

一、平均时间复杂度以及对应的空间复杂度分析

快速排序采用的是一个分治算法的思想,自定上下拆分成小的模块

时间复杂度:

(1)在对第一层里。while里的i从左向右遍历,j则相反,那么这两者共同遍历之后,一共走过的次数是n次,故第一层的时间复杂度为O(n)

(2)在第二层中。因为有要在第一层的序列中分成两半。故下面的每层就是n/2个元素

    QuickSort(array, low, i - 1);
    QuickSort(array, i + 1, high);

在这两半中,第一半要遍历n/2遍,第二半要遍历也要遍历n/2边,所以一共要遍历(n/2)*2=n遍

(3)在第三层中,将上一层的第一半里的n/2个元素再分为一半,同理第二半也再分为一半,所以是一共得到了4半,每一半(或者函数体)里的元素是n/4,也就是说再分出来之后的这四半里,每一半的while循环中,要遍历n/4次,因为共有4半,所以一共遍历(n/4)*4=n次

(4)对于第四层、第五层.....也是一样的道理,每一层都有n个元素需要遍历

又因为在第一层开始的后面每层,都要除以2的倍数,所以是2的x次方等于n,2^x=n,x=log2(n),所以一共有log2(n)层

(5)因为每一层要遍历n个元素,一共有log2(n)层,因此时间总和为n*log2(n);

所以时间复杂度时O(n*log2(n))

空间复杂度:

(1)第一层,因为

QuickSort(array, low, i - 1);

QuickSort(array, i + 1, high);

这两者是先后进行的,在执行完上面代码的之后再执行下面代码,又因为从第一层开始最先执行的是QuickSort(array, low, i - 1),且在没有回调一直递下去直到最底层时候,一共走了log2(n)次(因为有log2(n)层),每次的空间复杂度是o(1),因此最大的空间复杂度也就是log2(n)了

再执行下面的代码也是同理,最多执行了log2n次,因此综合来看,总的空间复杂度是O(log2(n))

二、最坏情况下的时间复杂度和空间复杂度

时间复杂度:

最坏的情况是当被排序的序列是基本有序序列时,所运行的时间最长,如{1,2,3,4,5,6,7}。因为如果我们取首元素为基准元素,那么开始的右指针会向左逐个扫描,找到是否有一个比首元素还要小的元素,但因为此时序列从左往右时非递减的,因此当右指针扫描到等于左指针时,才停止扫描,此时i==j==1。此时第一层需要遍历n-1次


    QuickSort(array, low, i - 1);
    QuickSort(array, i + 1, high);

(2)当进入到这两行代码时,因为i++,j--,i的值小于长度r,j的的值小于0,会被递归出来,因此只会进入到QuickSort(array, i + 1, high);代码里,进入第一层递归函数之后,l=2,r=7

所以新的一轮循环开始的时候,i=2,j=7

(3)此时又需要j从右依次扫描,需要找到比2小的元素,但因为找不到,因此又到了i==j==2的情况,因此遍历了n-2次

(4)之后整条序列中又减少了1个,进入下一个递归函数,需要遍历n-3次

(5)如此反复,每次仅仅减少一个元素

(6)当L==R时,不再遍历。总的遍历次数如下图

因此总的时间复杂度时(n-1)+(n-2)+(n-3)+……+1,总共有n-1项,等差数列求和得到(n^2-n)/2。

因此时间复杂度时O(n^2)

空间复杂度:

因为一直递归,每次递归序列元素只减少1,一共有(n-1)层,因此开辟了n-1个空间,故空间复杂度为O(n)

快速排序是一种常用的高效排序算法,它的基本思想是分而治之。以下是关于快速排序空间复杂度时间复杂度以及稳定性的分析: **时间复杂度**: - **平均时间复杂度**:在最理想的情况下,每次都能均匀地划分数组,快排的时间复杂度可以达到O(n log n)。这是基于递归树模型计算得出的,其中n是待排序元素的数量。 - **最坏时间复杂度**:如果输入数据已经是有序的或近乎有序,快速排序可能会退化为链式结构,导致时间复杂度变为O(n^2),尤其是在每次划分都只能减少一个元素的情况下。 - **最好时间复杂度**:同样地,当每次划分都完美时,即每次都能将数组均匀分成两部分,最好的情况也是O(n log n)。 **空间复杂度**: - 快速排序是一个原地排序算法,不需要额外的存储空间来存放额外的数据结构(除了递归栈)。因此,其空间复杂度是**O(log n)**,这是因为递归调用所需的栈空间随着递归深度增加而增长,对于最坏的情况是n层递归,但通常情况下不会那么高。 **稳定性**: - 快速排序不是稳定的排序算法。在分区过程中,相同的元素可能会交换位置,使得相等元素的相对顺序可能发生改变。例如,如果有两个相等的元素AB,它们的原始顺序是A先于B,经过排序后,B可能会出现在A之前。 总结来说,快速排序在平均情况下的性能非常好,但在极端情况下会降低效率。同时,它不是一个稳定的排序算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值