排序算法与完全排序的总比较

时间:2014-12-16 23:33:21

标签: arrays algorithm sorting

我想找到使用不同排序算法对数组中的 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

3 个答案:

答案 0 :(得分:1)

这不是一件容易的事,因为它可能取决于算法实现的细节,也不是 n 的纯函数。

实际上,您得到的是比较次数值的分布,具体取决于输入的排列。通常,一个区分最佳情况(最小数量的比较),最坏情况(最大数量)和平均情况(当您假设输入排列的相应概率时的数学期望)。

这些数字可以通过对程序的推理获得,但这通常是一项艰巨的任务(对于普通情况来说甚至令人生畏),通常用近似值解决。

无论如何,您可以通过检测程序来凭经验获得它:声明一个计数器变量,并在进行比较的同时递增它。

我建议你做以下练习:

  • 按照我的说法检测代码,
  • 采用 n 第一个整数的序列;
  • 生成所有可能的输入排列(只有 n 可能性 - 只要 n 保持较小,说 n up到10,这仍然是可管理的,10!= 3628800)并在每个上运行算法;
  • (或者你可以用随机数填充数组并重复多次);
  • 累积比较次数的直方图(对于每个可能的比较次数计算实现它的排列次数),
  • 观察并比较不同算法的直方图。

即使 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

但是,排序可以在线性时间内完成,具体取决于您的集合的类型,例如使用计数排序 - 一种直方图。