我想找到使用不同排序算法对数组中的 n 元素进行排序的总比较。我不想手动完成(如果数组中的元素数量相当大)。有没有"公式"计算下面列出的每种排序算法的比较,例如,如果数组中有8个元素包含以下元素[3,24,66,34,8,-5,42,80]?我怎样才能找到每个的比较?
1) Merge Sort
For example, if I use Merge sort manually in order to find the total numbers of
comparisons for 8 elements, this is what I get:
3, 24, 66, 34, 8, -5, 42, 80
3, 24, 66, 34 8, -5, 42, 80
3, 24 66, 34 8, -5 42, 80
3 24 66 34 8 -5 42 80
3, 24 34, 66 -5, 8 42, 80
3, 24, 34, 66 -5, 8, 42, 80
-5, 3, 8, 24, 34, 42, 66, 80
Total number of comparisons needed to sort this array = 15
I would like to be able to do this using a formula, if possible, not manually.
2) Insertion sort
答案 0 :(得分:1)
这不是一件容易的事,因为它可能取决于算法实现的细节,也不是 n 的纯函数。
实际上,您得到的是比较次数值的分布,具体取决于输入的排列。通常,一个区分最佳情况(最小数量的比较),最坏情况(最大数量)和平均情况(当您假设输入排列的相应概率时的数学期望)。
这些数字可以通过对程序的推理获得,但这通常是一项艰巨的任务(对于普通情况来说甚至令人生畏),通常用近似值解决。
无论如何,您可以通过检测程序来凭经验获得它:声明一个计数器变量,并在进行比较的同时递增它。
我建议你做以下练习:
即使 n 仍然适度,您将观察最佳和最差的情况,并且更加谨慎地看待中心趋势和传播。这应该是有益的。
使用相同的方法,您还可以观察元素位移的数量。
答案 1 :(得分:0)
这是不可能的,因为确切的数字取决于输入。这就是为什么你有乐观的复杂性,悲观和平均有时也称为预期。突出的例子是具有悲观复杂度O(n ^ 2)的快速排序的基本实现。另一方面,冒泡排序的乐观情况是O(n)。更多示例:http://en.wikipedia.org/wiki/Best,_worst_and_average_case#Sorting_algorithms。
您唯一能做的就是根据问题实例计算它,例如通过点击比较功能。虽然,我不确定每个实例的值是否非常有意义。
答案 2 :(得分:0)
通常人们不会进行这种计算。他们对评估算法的复杂性感兴趣,即“渐近地” 比较次数如何随输入“
的大小而增加例如,合并排序(平均)增长为O(n log n)。这意味着合并排序的比较次数不比n log n差,其中n是输入的大小。有一些方法可以达到这个表达式,即主定理或树方法。
实际上,可以证明,没有基于比较的算法不能比n log n做更少的比较。这就是所谓的比较模型! comparison algorithms
但是,排序可以在线性时间内完成,具体取决于您的集合的类型,例如使用计数排序 - 一种直方图。