簡體   English   中英

自定義排序函數被調用的次數

[英]Number of times the custom sort function is called

我有一個對象v的向量,該向量用自定義函數sortproc排序:

std::sort(v.begin(), v.end(), sortproc);

在對數組進行排序之前,我想提前知道sortproc將被調用多少次。

我嘗試了什么? 我嘗試克隆向量,然后對副本進行排序並計算sortproc被調用的次數。 我通過增加一個計數器來做到這一點。 然后,在對副本進行排序之后,我讀取了計數器的值並再次對原始向量進行了排序。 這行得通,但是效率很低,因為它要完成整個工作兩次。 有可能以更有效的方式做到這一點嗎?

幾乎可以肯定。 我想到的兩個障礙是:

1)該標准沒有定義std::sort使用什么算法,因此可移植的代碼無法准確地知道執行了多少次比較,而不僅僅是嘗試了一下。

2)即使您確實知道該算法,我認為對於明智的排序算法而言,弄清所需的比較次數要比弄清其數量與排序相同的反轉次數要容易得多。 因此,您將不會獲得更高效的解決方案。

2的解決方法是,如果sort算法使得比較次數不取決於數據的排序程度,而僅取決於數據的大小。 這不是困難,設計具有該屬性的排序算法。 它可能比“真實”排序算法效率低,但可能比兩次排序效率更高。

因此,僅以合並排序為例,通常在合並的一側用盡時,您將另一側的其余部分直接復制到目標中。 如果那時您只是為了構成數字而進行了一堆額外的冗余比較,那么比較的數目將不取決於輸入的順序。 無意義比較的數量將是最壞情況下總數的一半,因此它應該比排序兩次更糟糕。 不過,這與std::sort並不是一個“公平”的比較,因為歸類歸類仍然不是std::sort的有效算法:它使用了過多的內存。

排序網絡也使用固定數量的比較,但對std::sortstd::sort因為您需要知道設計網絡的項數...

暫無
暫無

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

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