#include <iostream>
using namespace std;
template <typename T>
void sink(T arr[], int pos, int N, int d) {
int start(pos*d + 1), max_index(start);
while(start < N) {
// Find the max amongst direct "children" of position `pos`
for(int i = start + 1; (i < start + d) && (i < N); i++) {
if (arr[i] > arr[max_index]) {
max_index = i;
}
}
// If arr[pos] is less than the max we found, switch them and proceed
if (arr[pos] < arr[max_index]) {
// Switch arr[pos] and arr[max_index] to enforce heap condition
T tmp = arr[pos];
arr[pos] = arr[max_index];
arr[max_index] = tmp;
// Update pos and start to sink "recursively"
pos = max_index;
start = pos*d + 1;
max_index = start;
} else { // Else, there is nothing to worry about further ...
break;
}
}
}
template <typename Comparable>
void buildHeap(Comparable arr[], int n, int d) {
// 1. The first index that might have children is n/d, not (n/d) - 1 !
// Be careful of how integer division works ...
for (int i = (n/d); i>=0; --i){
sink(arr, i, n, d);
}
}
template <typename Comparable>
Comparable removeFromHeap(Comparable heap[], int n, int d) {
Comparable root = heap[0];
heap[0] = heap[n-1];
sink(heap, 0, n-1, d);
return root;
}
template <typename T>
void dheapsort(T arr[], int N, int d) {
buildHeap(arr, N, d);
while (N > 1) {
T tmp = removeFromHeap(arr, N, d);
arr[--N] = tmp;
}
}
int main() {
int test[10] = {1, 3, 2, 5, 6, 8, 2, 8, 10, 11};
dheapsort(test, 10, 3);
for (int i = 0; i < 10; i++)
cout << "test[" << i << "] : " << test[i] << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgc2luayhUIGFycltdLCBpbnQgcG9zLCBpbnQgTiwgaW50IGQpIHsKICAgIGludCBzdGFydChwb3MqZCArIDEpLCBtYXhfaW5kZXgoc3RhcnQpOwogICAgd2hpbGUoc3RhcnQgPCBOKSB7CiAgICAgICAgLy8gRmluZCB0aGUgbWF4IGFtb25nc3QgZGlyZWN0ICJjaGlsZHJlbiIgb2YgcG9zaXRpb24gYHBvc2AKICAgICAgICBmb3IoaW50IGkgPSBzdGFydCArIDE7IChpIDwgc3RhcnQgKyBkKSAmJiAoaSA8IE4pOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFycltpXSA+IGFyclttYXhfaW5kZXhdKSB7CiAgICAgICAgICAgICAgICBtYXhfaW5kZXggPSBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFycltwb3NdIGlzIGxlc3MgdGhhbiB0aGUgbWF4IHdlIGZvdW5kLCBzd2l0Y2ggdGhlbSBhbmQgcHJvY2VlZAogICAgICAgIGlmIChhcnJbcG9zXSA8IGFyclttYXhfaW5kZXhdKSB7CiAgICAgICAgICAgIC8vIFN3aXRjaCBhcnJbcG9zXSBhbmQgYXJyW21heF9pbmRleF0gdG8gZW5mb3JjZSBoZWFwIGNvbmRpdGlvbgogICAgICAgICAgICBUIHRtcCA9IGFycltwb3NdOwogICAgICAgICAgICBhcnJbcG9zXSA9IGFyclttYXhfaW5kZXhdOwogICAgICAgICAgICBhcnJbbWF4X2luZGV4XSA9IHRtcDsKICAgICAgICAgICAgLy8gVXBkYXRlIHBvcyBhbmQgc3RhcnQgdG8gc2luayAicmVjdXJzaXZlbHkiCiAgICAgICAgICAgIHBvcyA9IG1heF9pbmRleDsKICAgICAgICAgICAgc3RhcnQgPSBwb3MqZCArIDE7CiAgICAgICAgICAgIG1heF9pbmRleCA9IHN0YXJ0OwogICAgICAgIH0gZWxzZSB7IC8vIEVsc2UsIHRoZXJlIGlzIG5vdGhpbmcgdG8gd29ycnkgYWJvdXQgZnVydGhlciAuLi4KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGFyYWJsZT4Kdm9pZCBidWlsZEhlYXAoQ29tcGFyYWJsZSBhcnJbXSwgaW50IG4sIGludCBkKSB7CiAgICAvLyAxLiBUaGUgZmlyc3QgaW5kZXggdGhhdCBtaWdodCBoYXZlIGNoaWxkcmVuIGlzIG4vZCwgbm90IChuL2QpIC0gMSAhCiAgICAvLyAgICBCZSBjYXJlZnVsIG9mIGhvdyBpbnRlZ2VyIGRpdmlzaW9uIHdvcmtzIC4uLgogICAgZm9yIChpbnQgaSA9IChuL2QpOyBpPj0wOyAtLWkpewogICAgICAgIHNpbmsoYXJyLCBpLCBuLCBkKTsKICAgIH0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmFibGU+CkNvbXBhcmFibGUgcmVtb3ZlRnJvbUhlYXAoQ29tcGFyYWJsZSBoZWFwW10sIGludCBuLCBpbnQgZCkgewogICAgQ29tcGFyYWJsZSByb290ID0gaGVhcFswXTsKICAgIGhlYXBbMF0gPSBoZWFwW24tMV07CiAgICBzaW5rKGhlYXAsIDAsIG4tMSwgZCk7CiAgICByZXR1cm4gcm9vdDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZGhlYXBzb3J0KFQgYXJyW10sIGludCBOLCBpbnQgZCkgewogICAgYnVpbGRIZWFwKGFyciwgTiwgZCk7CiAgICB3aGlsZSAoTiA+IDEpIHsKICAgICAgICBUIHRtcCA9IHJlbW92ZUZyb21IZWFwKGFyciwgTiwgZCk7CiAgICAgICAgYXJyWy0tTl0gPSB0bXA7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW50IHRlc3RbMTBdID0gezEsIDMsIDIsIDUsIDYsIDgsIDIsIDgsIDEwLCAxMX07CiAgICBkaGVhcHNvcnQodGVzdCwgMTAsIDMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQogICAgICAgIGNvdXQgPDwgInRlc3RbIiA8PCBpIDw8ICJdIDogIiA8PCB0ZXN0W2ldIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==