Pagini recente » Cod sursa (job #1267845) | Cod sursa (job #579997) | Cod sursa (job #1232684) | Cod sursa (job #844372) | Cod sursa (job #586976)
Cod sursa(job #586976)
#include <fstream>
using namespace std;
unsigned long long int v[500001];
unsigned long long int n;
void read()
{
ifstream fin("algsort.in");
fin >> n;
for(unsigned long long int i=1; i<=n; i++)
{
fin >> v[i];
}
fin.close();
}
void write()
{
ofstream fout("algsort.out");
for(unsigned long long int i=1; i<=n; i++)
{
fout << v[i] << " ";
}
fout.close();
}
void heapsort()
{
unsigned long long int begin = 1;
unsigned long long int end = n;
unsigned long long heap_size = end;
unsigned long long int temp, left, right, largest, k;
for(unsigned long long int i=heap_size/2; i>begin-1; i--)
{
largest = i;
do {
k = largest;
left = 2*k;
right = left+1;
if(left <= heap_size && v[left] > v[k])
largest = left;
else
largest = k;
if(right <= heap_size && v[right] > v[k])
largest = right;
if(k != largest)
{
temp = v[largest];
v[largest] = v[k];
v[k] = temp;
}
} while(largest != k);
}
for(unsigned long long int i=heap_size; i>begin; i--)
{
temp = v[1];
v[1] = v[heap_size];
v[heap_size] = temp;
heap_size--;
largest = 1;
do {
k = largest;
left = 2*k;
right = left+1;
if(left <= heap_size && v[left] > v[k])
largest = left;
else
largest = k;
if(right <= heap_size && v[right] > v[k])
largest = right;
if(k != largest)
{
temp = v[largest];
v[largest] = v[k];
v[k] = temp;
}
} while(largest != k);
}
}
int main()
{
read();
heapsort();
write();
return 0;
}