Вывод кода идет не так, как ожидалось - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь отсортировать объекты хеш-таблицы класса, используя 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 голосов
/ 20 мая 2019

Я думаю, что вам не нужен цикл while в вашей функции heapsort.Достаточно назвать его, как показано ниже:

void heapsort()
{
    for (int i=n/2-1;i>=0;i--) 
        heapify(i); 
}
0 голосов
/ 20 мая 2019

Предполагая, что вы хотите отсортировать по ключу, а затем по значению, вы можете альтернативно использовать 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;
}

...