代码的输出不符合预期

时间:2019-05-20 07:41:00

标签: c++ recursion vector hashmap heapsort

我正在尝试使用heapsort对类哈希表的对象进行排序

struct hashmap{
        int key;
        int value;   };


vector<hashmap> heap;
int n;
void heapify(int i)
{
    int l,r,max=i;
    l=2*i+1;
    r=2*i+2;
    if((heap[r].key>heap[max].key)||((heap[r].key=heap[max].key)&&(heap[r].value>heap[max].value)))
    {
       max=r;
    }
    else if((heap[l].key>heap[max].key)||((heap[l].key=heap[max].key)&&(heap[l].value>heap[max].value)))
    {
        max=l;
    }

    if(max!=i)
    {
    swap(heap[max],heap[i]);
    heapify(max);
    }
}

void heapsort()
{
    for (int i=n/2-1;i>=0;i--) 
        heapify(i); 

    while(n>0)
    {
        swap(heap[n-1],heap[0]);
        --n;
        heapify(0);             
    }
}
int main()
{
    cout<<"Enter the no of elements : ";
    cin>>n;
    Det(n);
    heapsort();
    display();
    return 0;
}
  

如果我的输入是(1,3)(2,5)(1,2)我的预期输出应该是(1,2)(1,3)(2,5),但这不是我的意思我得到了一些随机数作为输出。

2 个答案:

答案 0 :(得分:0)

假设您要先对键然后对值进行排序,则可以将std::sort与比较函数结合使用:

struct hashmap{
   int key;
   int value;
};

bool comp(const hashmap& a, const hashmap& b) {
    return tie(a.key, a.value) < tie(b.key, b.value);
}

int main()
{
  vector<hashmap> v{
       {1, 3}
     , {2, 5}
     , {1, 2}
  };

  sort(v.begin(), v.end(), comp);

  for (const auto& h : v) {
    cout << '(' << h.key << ',' << h.value << ')';
  }
  cout << endl;
  return 0;
}

答案 1 :(得分:0)

我认为您不需要在heapsort函数中进行while循环。像下面这样调用就足够了:

void heapsort()
{
    for (int i=n/2-1;i>=0;i--) 
        heapify(i); 
}