计数反转移位合并排序算法

时间:2019-03-03 22:44:41

标签: c++ algorithm mergesort

因此,我发现this implementation是一种计算倒置次数的算法。总的来说,我理解它,但是我不确定为什么要找到作者使用移位的中点 int mid=(low+((high-low)>>1));有人可以解释吗?预先感谢。

2 个答案:

答案 0 :(得分:2)

int mid=(low+((high-low)>>1));的“明显”方法是int mid=(low+high)/2;。后者有两个缺陷。

  1. 整数溢出。如果数组很长,low+high可能会溢出int的边界,这在C ++中是未定义的行为。在Java中,这是infamous bug的根本原因。

  2. 效率。好的编译器不会发出(昂贵的)除以二的指令。但是,除非编译器能以某种方式推断出low+high不是负数,否则编译器不能仅将除法(即,按照C ++标准截断除法)重写为移位(等同于下限除法),因为结果不同负股息。通常,它将发出指令以计算符号位并将其添加,这需要几个额外的指令(虽然便宜)。

答案 1 :(得分:0)

如果我没记错的话,向左移动意味着获取变量的一半..应该更快,然后除以2,因为您只将二进制数向左推了一步,这就是为什么他使用了这个小技巧