Cod sursa(job #2704354)

Utilizator mariusn01Marius Nicoli mariusn01 Data 10 februarie 2021 13:40:18
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
int v[500010];
int n, i, c, p;
ifstream fin ("algsort.in");
ofstream fout("algsort.out");
int main () {
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i];
/**
    7 6 4 5 8 2 9 1
    1 7 4 5 6 2 8 9
      8
   7     4
  5 6   2  1
 9
**/
    for (i=2;i<=n;i++) {
        /// am deja heap cu primele i-1 elemente si il transform in heap cu
        /// i elemente
        c = i;
        p = i/2;
        while (p >= 1 && v[c] > v[p]) {
            swap(v[c], v[p]);
            c = p;
            p = p/2;
        }

    }

    for (i=n;i>=2;i--) {
        swap(v[1], v[i]);
        /// corectez heapul cu i-1 elemente "stricat" doar de radacina
        p = 1;
        c = 2;
        while (c <= i-1) {
            if (c + 1 <= i-1 && v[c+1] > v[c]) /// daca fratele drept al radacinii e in heap
                c++;

            if (v[p] < v[c])
                swap(v[p], v[c]);
            else
                break;
            p = c;
            c = 2*c; /// initializez mereu c cu fiul stang al parintelui
        }
    }
    for (i=1;i<=n;i++)
        fout<<v[i]<<" ";

    return 0;
}