2017-03-24 9 views
0

ヒープソートアルゴリズムによって行われた比較の回数を数えようとしています。 私のコードは優先順位キューに基づいており、私はどこにカウンタを置くべきかを知りたい。ここに私が持っているものがありますが、カウンターを印刷しようとするとゼロカウントが表示されますが、何が間違っていますか?ありがとうございました。ここヒープソートで行われた比較の回数を数える

heapbuild機能である:

#include<iostream> 

vector<int> pq_keys; 
void buildHeap() 
{ 
int size = pq_keys.size(); 
int midIdx = (size -2)/2; 
while (midIdx >= 0) 
{  
    shiftRight(midIdx, size-1);  
    --midIdx; 
} 

、これは比較行う関数です:

int shiftRight(int low, int high) 
{ 
    int root = low; 
    int counter=0; 
    while ((root*2)+1 <= high) 
    { 
     int leftChild = (root * 2) + 1; 
     int rightChild = leftChild + 1; 
     int swapIdx = root; 
     if (pq_keys[swapIdx] < pq_keys[leftChild]) 
    { 
     counter++; 
     cout<<counter; 
     swapIdx = leftChild; 

    } 
    /*If right child exists check if it is less than current root*/ 
    if ((rightChild <= high) && (pq_keys[swapIdx] < pq_keys[rightChild])) 
    { 
    counter++; 
    swapIdx = rightChild;  
    } 
    /*Make the biggest element of root, left and right child the root*/ 
    if (swapIdx != root) 
    { 
    counter++; 
    int tmp = pq_keys[root]; 
    pq_keys[root] = pq_keys[swapIdx]; 
    pq_keys[swapIdx] = tmp; 
    root = swapIdx; 
    } 
    else 
    { 
     break; 
    } 
} 

return counter; 

} 
+0

[MCVE]を入力してください。 –

+0

リンクをありがとうが、私は2つの関数、実際に整数を比較してそれらをソートする関数を呼び出す主な関数を投稿しただけです。だから私は本当にそれをもっと見やすくするために私の質問にどのような変更を加えることができるのか分かりません。 – farah

答えて

0

あなたは比較を行う前にカウンターをインクリメントしたいが。

if (pq_keys[swapIdx] < pq_keys[leftChild]) 
{ 
    counter++; 
    cout<<counter; 
    swapIdx = leftChild; 

} 

条件がtrueの場合にのみ、カウンタをインクリメント:あなたのshiftRight方法から、このコードを考えてみましょう。 pq_keys[swpIdx] >= pq_keys[leftChild]の場合、それを数えずに比較しました。あなたは比較をカウントし、他の2つの場所で同じことを行う必要があり

counter++; 
if (pq_keys[swapIdx] < pq_keys[leftChild]) 
{ 
    cout<<counter; 
    swapIdx = leftChild; 

} 

:あなたはあなたのようにコードを変更する必要があるカウンタをインクリメント、その後、比較を行います。

+0

どのように私はそれを逃しましたか?ありがとうございました – farah

0
class LessPredicate 
{ 
    size_t callCount_ = 0; 

    temlate<class T> 
    bool compare(const T& l, conct T& r) 
    { 
    return l < r; // or other logic 
    } 
public: 
    size_t CallTimes() const { return callCount_; } 
    temlate<class T> 
    bool operator() (const T& l, conct T& r) 
    { 
    ++callCount_; 
    return compare(l, r); 
    } 
}; 



    int main() 
    { 
    LessPredicate less; 
    ...// use it like less(a, b) instead a < b; 
    auto compareCount = less.CallTimes(); 
    } 
関連する問題