簡體   English   中英

計數反轉移位合並排序算法

[英]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; 后者有兩個缺陷。

  1. 整數溢出。 如果數組很長,則low+high會溢出int的邊界,這在C ++中是未定義的行為。 在Java中,這是臭名昭著的bug的根本原因。

  2. 效率。 好的編譯器不會發出(昂貴的)除以二的指令。 但是,除非編譯器能以某種方式推斷出low+high不是負數,否則編譯器不能僅將除法(即,按照C ++標准截斷除法)重寫為移位(等效於下限除法),因為負數的結果不同分紅。 通常,它將發出指令以計算符號位並將其添加,這需要幾個額外的指令(盡管便宜)。

如果我沒記錯的話,向左移動意味着獲取一半的變量..應該更快,然后除以2,因為您只將二進制數向左推了一步,這就是為什么他使用了這個小技巧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM