首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >告知快速排序的进度

告知快速排序的进度
EN

Stack Overflow用户
提问于 2016-09-26 00:05:29
回答 1查看 163关注 0票数 1

我目前正在对文件进行排序。目前,我使用heapsort来实现它,因为它很容易判断它的进度。我的意思是,有两个循环一个接一个,通过对两个循环中每一个循环的权重进行一些细微的调整,你就可以很好地估计当前的进度,并且显示一个进度条非常容易。

因为快速排序在大多数情况下比堆排序快,所以我想用它来代替,但我不确定如何判断它的进度。

EN

回答 1

Stack Overflow用户

发布于 2016-09-26 02:01:39

有三个步骤:

  • 将元素分成两个列表
  • 排序左侧列表
  • 排序右侧列表

您可以为每个步骤分配一部分在执行过程中必须填充的进度。假设总共有100%。假设两个列表的大小相同,步骤1获得20%,步骤2获得40%,步骤3也获得40%。这可以递归地继续。

问题是每一步的分数到底有多大。快速排序的平均时间复杂度为n*log(n)。假设对包含n元素的列表进行total = c*n*log(n)比较来排序。对大小为n*f (f < 1)的子列表进行排序需要进行以下数量的比较。

代码语言:javascript
复制
c*(n*f)*log(n*f) = 
c*(n*f)*(log(n)+log(f)) =
(c*n*log(n))*f + c*n*log(f)*f =
total*f + c*n*log(f)*f

因为f < 1,所以c*n*log(f)*f是负数。另一个子列表需要进行total*(1-f) + c*n*log(1-f)*(1-f)比较。因此,第一步需要进行以下数量的比较。

代码语言:javascript
复制
total - (total*f + c*n*log(f)*f) - (total*(1-f) + c*n*log(1-f)*(1-f)) =
total - total*f - total*(1-f) - (c*n*log(f)*f) - (c*n*log(1-f)*(1-f)) =
- (c*n*log(f)*f) - (c*n*log(1-f)*(1-f)) =
- c*n*(log(f)*f+log(1-f)*(1-f))

剩下的问题是:c的价值是什么?如果c是已知的,并且我没有犯错误,那么应该可以使用上面的公式计算这三个步骤的平均时间分数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39688960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档