====== Heap sort (indexovani od 0) ======
#include
#include
using namespace std;
const int N = 1000;
int a [N];
inline void swap (int i, int k)
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
void heapify (int i, int k)
// vytvorit haldu s indexy i, ..., k
// za predpokladu, ze indexy i+1, ..., k jiz haldu tvori
{
while (2*i+1 <= k) // levy existuje
{
int v = 2*i+1; // index leveho
if (v+1 <= k) // pravy existuje
if (a [v+1] > a [v]) // pravy je vetsi
v = v+1; // index vetsiho
if (a [v] > a [i]) // porovnani vetsiho a prvku nahore
{
swap (v, i); // prohodime
i = v; // pokracujeme s indexem v
}
else
{
i = k; // zastavime cylus
}
}
}
void heapSort (int n)
{
for (int i = n-1; i >= 0; i--)
heapify (i, n-1);
swap (0, n-1);
for (int k = n-2; k >= 1; k--)
{
heapify (0, k);
swap (0, k);
}
}
int main ()
{
srand (time (nullptr));
for (int i = 0; i < N; i++)
a [i] = rand () % 10000;
heapSort (N);
bool ok = true;
for (int i = 0; i < N; i++)
{
cout << a [i];
if (i < N-1 && a [i + 1] < a [i]) { ok = false; cout << " CHYBA"; }
cout << endl;
}
if (ok)
cout << "O.K." << endl;
}
====== Heap sort (indexovani od 1) ======
#include
#include
using namespace std;
const int N = 1000;
int a [N+1]; // a[0] nepouzivam
inline void swap (int i, int k)
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
void heapify (int i, int k)
// vytvorit haldu s indexy i, ..., k
// za predpokladu, ze indexy i+1, ..., k jiz haldu tvori
{
while (2*i <= k) // levy existuje
{
int v = 2*i; // index leveho
if (v+1 <= k) // pravy existuje
if (a [v+1] > a [v]) // pravy je vetsi
v = v+1; // index vetsiho
if (a [v] > a [i]) // porovnani vetsiho a prvku nahore
{
swap (v, i); // prohodime
i = v; // pokracujeme s indexem v
}
else
{
i = k; // zastavime cylus
}
}
}
void heapSort (int n)
{
for (int i = n; i >= 1; i--)
heapify (i, n);
swap (1, n);
for (int k = n-1; k >= 2; k--)
{
heapify (1, k);
swap (1, k);
}
}
int main ()
{
srand (time (nullptr));
a[0] = 0;
for (int i = 1; i <= N; i++)
a [i] = rand () % 10000;
heapSort (N);
bool ok = true;
for (int i = 1; i <= N; i++)
{
cout << a [i];
if (i < N && a[i+1] < a[i]) { ok = false; cout << " CHYBA"; }
cout << endl;
}
if (ok)
cout << "O.K." << endl;
}