[英]Shift in counting inversions merge sort algorithm
所以,我發現這個實現的算法的計數倒置。 總的來說,我理解這一點,但是我不確定為什么要查找中點時,作者使用shift int mid=(low+((high-low)>>1));
有人可以解釋一下嗎? 提前致謝。
int mid=(low+((high-low)>>1));
的“顯而易見”方法int mid=(low+((high-low)>>1));
是int mid=(low+high)/2;
。 后者有兩個缺陷。
整數溢出。 如果數組很長,則low+high
會溢出int
的邊界,這在C ++中是未定義的行為。 在Java中,這是臭名昭著的bug的根本原因。
效率。 好的編譯器不會發出(昂貴的)除以二的指令。 但是,除非編譯器能以某種方式推斷出low+high
不是負數,否則編譯器不能僅將除法(即,按照C ++標准截斷除法)重寫為移位(等效於下限除法),因為負數的結果不同分紅。 通常,它將發出指令以計算符號位並將其添加,這需要幾個額外的指令(盡管便宜)。
如果我沒記錯的話,向左移動意味着獲取一半的變量..應該更快,然后除以2,因為您只將二進制數向左推了一步,這就是為什么他使用了這個小技巧
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.