如何分析排序算法?

Posted

技术标签:

【中文标题】如何分析排序算法?【英文标题】:How to profile sort algorithms? 【发布时间】:2011-06-06 16:10:11 【问题描述】:

我已经用 C 编写了一些排序方法,我想找到程序在分析每个算法时达到最佳(即)的输入大小。但是我该怎么做呢?我知道为每种方法计时,但我不知道如何找到它“最佳”的大小。

【问题讨论】:

【参考方案1】:

这取决于一些因素:

数据行为:您的数据是否已经部分排序?还是很随机?

数据大小:对于大输入(例如 1000 或更多),您可以确保 O(N^2) 排序方法将输给 O(N*log(N) ) 方法..

数据的数据结构:是数组还是列表还是?。对于诸如列表之类的数据,具有非顺序访问数据的排序方法会变慢

因此,答案是通过经验性地运行您的程序,使用一些真实数据,您可能会通过改变输入大小来处理这些数据。

当输入大小为> X 时,当较慢的方法(如 O(N^2))被较快的方法(如 O(N*log(N)))击败时,您可以说较慢的方法是'经验最优'用于输入大小<= X(该值取决于输入数据的特征)。

【讨论】:

您的逻辑中的一个缺陷是“平均为 O(n log n)”的算法(即快速排序)看起来很快,但在极端情况下很难命中但速度很慢。跨度> @R:是的,我记得一些 DOS 攻击(不知道我的心声——也许只是传闻,但很好)使用了特制的输入数据,导致使用的快速排序表现为 n^2 排序.所以这是要记住的事情! (尽管在大多数情况下可能并不重要)【参考方案2】:

排序算法没有一个最佳值。

对于纯粹的执行时间,几乎所有排序算法在一组 2 个数字上都是最快的,但在大多数情况下它没有用。

某些排序算法可能在较小的数据集上更有效,但这并不意味着它们在那个大小上是“最优的”。

某些分类也可以更好地处理数据的其他特征。如果数据几乎已经排序,则有些排序可能非常有效,但如果不是,则可能会非常慢。其他人将在任何给定尺寸的集合上运行相同。

查看排序的大 O(例如 O(n^2)、O(n log n) 等)以及排序具有的任何特殊属性(例如对几乎排序的数据进行操作)会更有用。

【讨论】:

【参考方案3】:

要找到程序最佳的输入大小(我假设您的意思是最快的,或者排序算法需要最少比较的输入大小),您必须针对各种输入对其进行测试并绘制独立轴(输入大小)相对于依赖轴(运行时)并找到最小值。

【讨论】:

以上是关于如何分析排序算法?的主要内容,如果未能解决你的问题,请参考以下文章

排序算法分析-java实现

算法与数据结构

排序(上):冒泡排序插入排序和选择排序

Scratch算法讲解04-Scratch快速排序 少儿编程Scratch常见排序算法案例分析讲解

Scratch算法讲解Scratch插入排序 少儿编程Scratch常见排序算法案例分析讲解三

基础排序算法总结(代码+图片分析)