Arrays 区分排序算法

Arrays 区分排序算法,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,有没有办法区分排序算法和它们的可执行文件?我在一个大学编程邮件列表中发现了这样的问题:假设我有许多可执行文件,它们使用不同的算法对数据数组进行排序。我知道用什么算法来编写这些可执行文件,但我不知道在哪个可执行文件中使用了哪种算法。使用的算法有: 无意识气泡排序 提前退出的冒泡排序 传统插入排序 列表上的插入排序 带二进制搜索的插入排序 传统选择排序 合并排序 传统快速分拣 三个中间值的快速排序 随机快速排序 SHELL排序时间4 博戈分类 基数排序LSD优先 斗式分拣 计数排序 您可以通过给它们

有没有办法区分排序算法和它们的可执行文件?我在一个大学编程邮件列表中发现了这样的问题:假设我有许多可执行文件,它们使用不同的算法对数据数组进行排序。我知道用什么算法来编写这些可执行文件,但我不知道在哪个可执行文件中使用了哪种算法。使用的算法有:

  • 无意识气泡排序
  • 提前退出的冒泡排序
  • 传统插入排序
  • 列表上的插入排序
  • 带二进制搜索的插入排序
  • 传统选择排序
  • 合并排序
  • 传统快速分拣
  • 三个中间值的快速排序
  • 随机快速排序
  • SHELL排序时间4
  • 博戈分类
  • 基数排序LSD优先
  • 斗式分拣
  • 计数排序

  • 您可以通过给它们越来越大的输入来检查它们的渐近行为,但列出的许多算法属于相同的复杂度类别,因此您无法仅基于此来区分合并排序和快速排序

    为了打破这些退化现象,您还可以查看不同可执行文件的内存使用情况,继续使用合并排序和快速排序示例,您将看到合并排序需要O(n)个额外空间,而快速排序只需要O(logn)个额外空间(堆栈大小)来执行排序

    您可能能够从给他们退化输入中推断出一些东西,例如一兆字节的零或一兆字节的反向字符串。但你只能做一些有根据的猜测


    (下面的评论非常好。将此作为社区wiki,请随意编辑。)

    更改数据类型和输入的数据量,并比较执行时间

    更改数据的性质(重复的小数字(几个数字)与分布广泛且无重复的数据)有助于确定排序算法是否基于比较(基数/桶排序与基于比较的排序)。例如,使用bucket sort对1000000个1位数的数字进行排序是非常快的,因为它主要根据位数进行缩放,但对于主要根据数据集大小进行缩放的基于比较的排序来说,速度较慢

    您还可以定制数据,使某些算法的性能优于其他算法,例如对各种算法使用最佳情况场景和最坏情况场景,并查找执行时间变化最显著的.exe


    例如,要区分插入排序和选择排序,请使用类似(
    2,3,…98,99,1
    )的几乎排序的结果集。插入排序将执行一次插入移位,然后下一次检查将注意到列表已排序。这几乎不需要时间。选择排序必须在每个索引处交换,因为最小值总是在最终索引处,这需要很长时间

    在CMD中使用以下命令,您将找到我们可以订购的每个代码的处理时间。 回显%时间% filename.exe
    echo%time%

    我不认为可执行文件的反汇编是一个选项?答案是肯定的。您可以使用多种策略来实现这一点。1-测量不同输入大小的内存使用情况,2-测量作为输入大小函数的运行时间,3-测量病理输入的do#2我认为这不是一个选项。这可能是为了学习更多关于这些算法差异的练习。如果他知道这是经典的快速排序,比如说,他可以构建一个病态的测试用例——在这个用例中快速排序总是选择最差的可能支点——并且非常有力地证明,如果性能不好,这确实是使用的算法。其他算法也可能有类似的观察结果。您是否能够根据程序的内存需求来区分合并排序和快速排序?因为快速排序可以在O(logn)内存中完成,而合并排序需要O(n)额外内存。@SimonGibbons快速排序是O(logn)内存(预期堆栈大小),谢谢,现在更改了。