潮汐707 2023-04-06 21:29 采纳率: 100%
浏览 17
已结题

关于#算法#的问题,如何解决?

试分析以下程序的时间复杂度O(), 即当输入个数不是7而是很大时的时间代价,给出具体分析的依据和过程,并指出最差的情况.


#include "stdafx.h"

#include <stdio.h>

void qst(int s[], int l, int r) {   

int i, j, x;   

if (l < r)    {       

i = l;        j = r;        x = s[i];       

while (i < j)        {

          while(i < j && s[j] > x)     j--; /* 从右向左找第一个小于x的数 */           

if(i < j)   s[i++] = s[j];                   

while(i < j && s[i] < x)     i++; /* 从左向右找第一个大于x的数 */           

if(i < j)   s[j--] = s[i];        

}       

s[i] = x;       

qst(s, l, i-1); /* 递归调用 */       

qst(s, i+1, r);   

}

} 

int _tmain(int argc, _TCHAR* argv[]) {

          int a[]={49,38,65,97,76,13,27};  

int l = 0;

int r = 6;              

qst(a, l, r);      

for (int i=0; i<=r; i++)       printf ("%4d", a[i]);         

return 0;

}



  • 写回答

2条回答 默认 最新

  • 0xjade-Follow 2023-04-06 23:38
    关注

    这段程序实现了快速排序算法,它的时间复杂度为O(nlogn),其中n为输入元素的数量。下面是具体分析过程:

    在最优情况下,即每次划分都刚好分为两半,快排算法的时间复杂度为O(nlogn)。在最差情况下,即待排序数组已经有序或接近有序,每次划分只能将序列分成一个元素和n-1个元素,此时算法的时间复杂度退化为O(n^2)。

    快排算法的时间复杂度分析主要基于划分操作的次数,因为每次划分操作能够将一个元素放到其最终位置上,而这个位置的索引可以被看作是一个基准元素的索引,因此每次划分后都可以将待排序数组分成两个子数组,递归处理子数组的过程可以看作是树形结构,其高度取决于树的深度,而树的深度又决定了划分操作的次数。

    在这个程序中,每次划分的过程都需要遍历整个数组,所以其时间复杂度为O(n),而该算法最多需要划分logn次,因此总时间复杂度为O(nlogn)。但是如果待排序的数组已经有序或接近有序,每次划分只能将序列分成一个元素和n-1个元素,此时算法的时间复杂度退化为O(n^2)。

    需要注意的是,这段程序中的快排算法是用递归实现的,如果待排序数组的长度很大,递归的过程可能会导致栈溢出,因此可以使用非递归实现的快排算法来避免这个问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 专家修改了标签 4月10日
  • 已采纳回答 4月7日
  • 创建了问题 4月6日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向