Cod sursa(job #2803553)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 20 noiembrie 2021 10:54:27
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#include <chrono>
#include <map>
typedef unsigned long long ull;
typedef long long ll;
typedef unsigned int uint;
#define endl '\n'
using namespace std;
#if 1
#include <fstream>
ifstream fin("algsort.in");
ofstream fout("algsort.out");
#define cin fin
#define cout fout
#endif
//int  k, q;
//int GetSubDiv(int n)
//{
//	int p, ans = 0,ansi = 0;
//	for (int i = 0;; i++)
//	{
//		p = k + (1 << 2 * i);
//		if (n < p)
//			return ansi;
//		else
//			ans = p,ansi = i;
//	}
//}
//bool b = 0;
//int F(int lv,int n)
//{
//	int nr = ((1 << lv) * k);
//	int div = n / nr;
//	int mod = n % nr;
//	if (div == 2 || div == 3)
//		b = !b;
//	if (lv == 0)
//		return mod;
//	else
//		return F(lv - 1, mod);
//}
//char c[100000];
//char Flip(char c)
//{
//	if ('A' <= c && c <= 'Z')
//		return c + 32;
//	else
//		return c - 32;
//}
//int main()
//{
//	cin >> k >> q;
//	cin >> c;
//	while (k--)
//	{
//		int n;
//		cin >> n;
//		int nrTot = GetSubDiv(n);
//		int md = F(nrTot, n);
//		cout << ((b == 0) ? c[md] : Flip(c[md]));
//	}
//}

int a[500000];
int aux[500000];
void Heap(int st, int dr)
{
	int len = dr - st + 1;
	if (len == 1)
		return;
	if (len == 2)
	{
		if (a[st] > a[dr])
			swap(a[st], a[dr]);
		return;
	}
	int k1 = st, k2 = st + len / 2 + 1;
	int ln1 = k1 + len / 2;
	Heap(k1, ln1);
	Heap(k2, dr);
	int k = st;
	while (k1 <= ln1 && k2 <= dr)
	{
		if (a[k1] < a[k2])
		{
			aux[k++] = a[k1];
			k1++;
		}
		else
		{
			aux[k++] = a[k2];
			k2++;
		}
	}
	while (k1 <= ln1)
		aux[k++] = a[k1], k1++;
	while (k2 <= dr)
		aux[k++] = a[k2], k2++;

	for (int i = st; i <= dr; i++) // Copiere
		a[i] = aux[i];
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	Heap(0, n-1);
	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
}