告诉快速排序的进度

时间:2016-09-25 16:05:29

标签: progress-bar quicksort

我目前正致力于排序文件。目前我使用heapsort因为它很容易分辨它的进展。我的意思是有两个循环一个接一个地稍微调整你给两个循环中的每一个循环的重量多少你对当前进度的非常好的估计并且显示进度条不是更容易

由于quicksort在大多数情况下比heapsort更快,我喜欢使用它,但我不知道如何判断它的进展。

1 个答案:

答案 0 :(得分:1)

有三个步骤:

  • 将元素分成两个列表

  • 排序左侧列表

  • 排序右侧列表

您可以为每个步骤提供执行期间必须填写的部分进度。我们说总共有100%。假设两个列表具有相同的大小,则步骤1得到20%,步骤2得到40%,步骤3得到40%。这可以递归地继续。

问题是每个步骤的分数实际上有多大。快速排序的平均时间复杂度为n*log(n)。我们假设需要进行total = c*n*log(n)比较,以使用n元素对列表进行排序。对大小为n*ff < 1)的子列表进行排序需要进行以下比较。

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

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

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已知并且我没有弄错,则应该可以使用上面的公式计算三个步骤的平均时间分数。