Heap sort (indexovani od 1)

#include <iostream>
#include <time.h>
using namespace std;
 
const int N = 1000;
 
// int a [N+1] = { 0 /* a[0] nepouzivam */, 10, 4, 8, 20, 7, 5, 1 };
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)
{
    while (2*i <= k) // dokud existuje levy
    {
        int v = 2*i; // index leveho
        if (v+1 <= k) // pokud pravy existuje
        {
            if (a [v+1] > a [v]) // pokud pravy je vetsi nez levy
                v = v + 1; // index vetsiho 
        }
 
        if (a [i] < a [v]) // nahore je mensi
        {
            // prohodit a[i] <-> a[v]
            swap (i, v);
            // int t = a [i];
            // a [i] = a [v];
            // a [v] = t;
 
            i = v; // pokracovat spodnim prvkem
        }
        else
        {
            i = k+1; // konec
        }
    }
}
 
void heapSort ()
{
    for (int k = N; k >= 1; k--)
    {
        heapify (k, N);
    }
 
    swap (1, N); // a[1] <-> a[N], v a[N] je ulozeno maximum
 
    for (int k = N-1; k > 1; k--)
    {
        heapify (1, k);
        swap (1, k);
    }
}
 
int main()
{
    srand (time (nullptr));
    for (int i = 1; i <= N; i++)
        a [i] = (rand () % 1000) + 1000 * (rand () % 1000);
 
    heapSort ();
 
    bool ok = true;
    for (int i = 1; i <= N; i++)
    {
        if (i > 1)
        {
            if (a [i-1] > a [i])
            {
                cout << "CHYBA";
                ok = false;
            }
        }
        cout << a [i] << endl;
    }
 
    if (ok)
    {
        cout << "O.K." << endl;
    }
}
 
zalg/heapsort_st.txt · Last modified: 2021/03/31 15:53 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki