Cod sursa(job #636149)

Utilizator an_drey_curentandreycurent an_drey_curent Data 19 noiembrie 2011 17:25:47
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
void citire(vector<long int>&v,long int &n)
{
	long int i,x;
	f>>n;
	for(i=1;i<=n;i++)
	{
		f>>x;
		v.push_back(x);
	}
}
void interclasare(vector<long int>&v_1,long int st_1,long int dr_1,vector<long int>&v_2,long int st_2,long int dr_2,vector<long int>&v_3,long int st_3,long int dr_3)
{
	vector<long int>auxiliar;
	long int i,save_st_1=st_1,save_dr_1=dr_1,save_st_2=st_2,save_dr_2=dr_2;
	while(st_1<=dr_1&&st_2<=dr_2)
		if(v_1[st_1]<v_2[st_2])
			auxiliar.push_back(v_1[st_1++]);
		else
			if(v_1[st_1]>v_2[st_2])
				auxiliar.push_back(v_2[st_2++]);
			else
				if(v_1[st_1]==v_2[st_2])
				{
					auxiliar.push_back(v_1[st_1++]);
					auxiliar.push_back(v_2[st_2++]);
				}
	while(st_1<=dr_1)
		auxiliar.push_back(v_1[st_1++]);
	while(st_2<=dr_2)
		auxiliar.push_back(v_2[st_2++]);
	for(i=0;i<(save_dr_1-save_st_1+save_dr_2-save_st_2+2);i++)
		v_3[st_3++]=auxiliar[i];
}
void merge_sort(vector<long int>&v,long int st,long int dr)
{
	long int m;
	if(st<dr)
	{
		m=(st+dr)/2;
		merge_sort(v,st,m);
		merge_sort(v,m+1,dr);
		interclasare(v,st,m,v,m+1,dr,v,st,dr);
	}
}
void afisare(vector<long int>v,long int n)
{
	long int i;
	for(i=0;i<n;i++)
		g<<v[i]<<' ';
		
}
int main()
{
	long int n;
	vector<long int>v;
	citire(v,n);
	merge_sort(v,0,n-1);
	afisare(v,n);
	f.close();
	g.close();
	return 0;
}