Cod sursa(job #3357427)

Utilizator mariusn01Marius Nicoli mariusn01 Data 9 iunie 2026 18:44:59
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
using namespace std;
int v[500010];
int n, p, c, i;
int main () {
    ifstream fin ("algsort.in");
    ofstream fout("algsort.out");

    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i];

    for (i=2;i<=n;i++ ){
        c = i;
        p = i/2;
        while (p!=0 && v[c] > v[p]) {
            swap(v[c], v[p]);
            c = p;
            p = p/2;
        }
    }
    /// ca la sortarea prin insertie, algoritmul de mai sus insereaza in mod repetat fiecare element de pe pozitia i
    /// in heapul deja format inainte cu primele i elemente.
    /// Mai pe scurt, transforma sirul dat in heap.
/**
    1 2 3 4 5 6
    8 5 4 1 2 3

          1(8)
       /       \
   2(5)         3(4)
  /   \         /
4(1)  5(2)     6(3)
**/
    /// un heap nu e un sir sortat in schimb are maximul pus in fata, pe pozitia 1


    for (i=n;i>=2;i--) {
        swap(v[1], v[i]); /// duc maximul la final
        /// de la pozitia i inspre n nu ma va ma interesa pentru ca duc mereu cate un maxim la locul lui
        /// ma incurca insa ca in locul radacinii am adus un element de la final de tot care poate fi foarte mic
        /// am de corectat heapul format cu primele i-1 elemente stricat doar de radacina

        p = 1;
        c = 2; /// fiul stang
        while (c <= i-1) {/// dimensiunea care ma intereseaza  este i-1
            if (c+1 <= i-1 && v[c+1] > v[c]) /// m-as uita la fiul stang, dar daca cel drept exista si e mai mare ma mut in el
                c = c+1;
            if (v[p] < v[c]) {
                swap(v[p], v[c]);
                p = c;
                c = 2*c; /// mereu fiul stang intai
            } else
                break;
        }
        /// operatia de mai sus este cea de corectare dupa inlocuirea radacinii care este cumva inversa celei de inserara
        /// facand coborare in heap, si lucrul special de tinut cont este sa ma duc in fiul cel mare daca el exista.
    }
    /**
    1 2 3 4 5 6
    3 5 4 1 2 8

          1(3)
       /       \
   2(5)         3(4)
  /   \
4(1)  5(2)
    **/
    for (i=1;i<=n;i++)
        fout<<v[i]<<" ";

    return 0;
}