#include <vector>
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
vector<unsigned long long> myArray;
vector<unsigned long long> orig_index;
vector<unsigned long long> new_index;
unsigned long long heapify(unsigned long long count)
{
unsigned long long temp, left, right, min;
long long j;
unsigned long long n_swaps = 0;
for (long long i = (count % 2 ? (count - 2) / 2 : (count - 1) / 2); i >= 0; --i) {
left = (2 * i) + 1;
right = (2 * i) + 2;
j = i;
while (((myArray.at(j) > myArray.at(left)) && left < count) || ((myArray[j] > myArray.at(right)) && (right < count))) {
//Swap
//Find lesser of left or right
if (right >= count) {
min = myArray[left];
}
else {
min = myArray[left] > myArray[right] ? myArray[right] : myArray[left];
}
if (myArray[j] > myArray[left] && (min == myArray[left])) {
temp = myArray[j];
myArray[j] = myArray[left];
myArray[left] = temp;
//Update indexes
orig_index.push_back(j);
new_index.push_back(left);
j = left;
right = (2 * left) + 2;
left = (2 * left) + 1;
++n_swaps;
}
else if ((right < count) && (myArray[j] > myArray[right])) {
temp = myArray[j];
myArray[j] = myArray[right];
myArray[right] = temp;
//Update indexes
orig_index.push_back(j);
new_index.push_back(right);
j = right;
left = (2 * right) + 1;
right = (2 * right) + 2;
++n_swaps;
}
}
}
return n_swaps;
}
void generate(unsigned long long count, unsigned long long max) {
srand(time(NULL));
//Dummy array of max size
vector<unsigned long long> dummy;
//Populate the dummy
for (unsigned long long i = 0; i < max; ++i) {
dummy.push_back(i);
}
//Select random number from dummy, swap with last and pop
unsigned long long temp;
unsigned long long swap;
unsigned long long dummy_size = max - 1;
cout << "****************Indices************" << endl;
for (unsigned long long i = 0; i < count; ++i) {
temp = rand() % dummy_size;
myArray.push_back(dummy.at(temp));
//Swap and pop
swap = dummy[temp];
dummy[temp] = dummy.at(dummy_size);
dummy[dummy_size] = swap;
--dummy_size;
}
cout << "*************End*****************" << endl;
dummy.clear();
}
int main(void) {
unsigned long long count = 25;
unsigned long long max = 1000;
//Generate random numbers and push on array
generate(count, max);
//Build heap
unsigned long long n_swaps = heapify(count);
return 0;
}