Cod sursa(job #3153064)

Utilizator dariustgameTimar Darius dariustgame Data 27 septembrie 2023 21:16:10
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

using namespace std;
 
ifstream fin("algsort.in");
ofstream fout("algsort.out");

int n;
int a[1000000];
int b[1000000];

void interclasare(int st, int dr)
{
	int mid = (st + dr) / 2;
	int i = st;
	int j = mid + 1;
	int k = st;
	while (i <= mid && j <= dr)
	{
		if (a[i] < a[j])
		{
			b[k] = a[i];
			k++;
			i++;
		}
		else
		{
			b[k] = a[j];
			k++;
			j++;
		}
	}
	while (i <= mid)
	{
		b[k] = a[i];
		k++;
		i++;
	}
	while (j <= dr)
	{
		b[k] = a[j];
		k++;
		j++;
	}
	for (int o = st; o < k; o++)
	{
		a[o] = b[o];
	}
}

void merge_sort(int st, int dr)
{
	if (st == dr)
	{
		return;
	}
	else
	{
		int mid = (st + dr) / 2;
		merge_sort(st, mid);
		merge_sort(mid + 1, dr);
		interclasare(st, dr);
	}
}

int divide(int st, int dr)
{
	int piv = a[dr];
	int j = st;

	for (int i = st; i < dr; i++)
	{
		if (a[i] <= piv)
		{
			swap(a[j], a[i]);
			j++;
		}
	}
	swap(a[j], a[dr]);
	return j;
}

void quick_sort(int st, int dr)
{
	if (st >= dr)
	{
		return;
	}
	else
	{
		int piv = divide(st, dr);
		quick_sort(st, piv - 1);
		quick_sort(piv + 1, dr);
	}
}

int main()
{
	fin >> n;
	for (int i = 0; i < n; i++)
	{
		fin >> a[i];
	}
	merge_sort(0, n - 1);
	for (int i = 0; i < n; i++)
	{
		fout << a[i] << ' ';
	}
}