更昂贵的是:比较或访问数组的索引

时间:2016-05-05 20:36:47

标签: arrays sorting quicksort mergesort

基本上我看到我在youtube上的视频可视化排序算法,他们提供了程序,以便我们可以玩它..并且程序计算两个主要的东西(比较,数组访问)..我想看看哪一个(合并和快速)排序是最快的..

100个随机数

快速排序:
  比较1000
  数组访问1400

合并排序:
  比较540
  数组访问1900

如此快速排序使用较少的数组访问,而合并排序使用较少的比较,差异随着索引的数量而增加..那么其中哪一个更难用于计算机呢?

2 个答案:

答案 0 :(得分:0)

数字已关闭。实际运行的结果有100个随机数。请注意,快速排序比较计数受实施影响,Hoare比Lomuto使用更少的比较。

快速排序(Hoare分区方案)

pivot reads      87   (average)
compares        401   (average)
array accesses  854   (average)

合并排序:

compares        307  (average)
array accesses 1400  (best, average, worst)

由于数字正在排序,我假设它们适合寄存器,这减少了数组访问。

为了快速排序,比较完成与一个数据透视值的比较,每个快速排序的递归实例应该只读取一次,并放在一个寄存器中,然后对每个值进行一次读取比较。优化编译器可以保留寄存器中用于比较的值,以便交换已经在寄存器中具有两个值,并且只需要进行两次写入。

对于合并排序,比较会为数组访问增加几乎为零的开销,因为比较的值将被读入寄存器,进行比较,然后从寄存器写入,而不是再次从内存中读取。

答案 1 :(得分:0)

排序性能取决于许多条件,我认为回答您的确切问题不会导致有用的答案(您可以自己轻松地对其进行基准测试)。

  1. 对少量元素进行排序通常不是时间关键,基准测试对于较大的列表是有意义的。
  2. 对于整数数组进行排序也是一种罕见的情况,对对象列表进行排序,比较一个或多个属性更为常见。
  3. 如果您追求性能,请考虑多线程。
  4. MergeSort是稳定的(相等的元素保持其相对位置),QuickSort不是,所以你要比较不同的结果。
  5. 在您的示例中,快速排序算法在大多数情况下可能更快。如果比较更复杂,例如字符串而不是int或多个字段,MergeSort将变得越来越有效,因为它需要更少(昂贵)的比较。如果你想要对排序进行并行化,MergeSort是因为算法本身而预定的。