Pagini recente » Cod sursa (job #1598850) | Cod sursa (job #1216965) | Cod sursa (job #1210143) | Cod sursa (job #1804419) | Cod sursa (job #3357427)
#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;
}