Cod sursa(job #1493142)

Utilizator deea101Andreea deea101 Data 28 septembrie 2015 19:25:48
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void merge_sort(vector <int> &v, vector <int> &temp, int l, int r) {
	if(r - l <= 1) return;
	int m = l + (r-l)/2;
	merge_sort(v, temp, l, m);
	merge_sort(v, temp, m, r);
	
	int i = l, j = m, k;
	
	for(k = l; k < r; k++)
		if(j == r || (i < m && v[i]<=v[j])) {
			temp[k] = v[i];
			i++;
		}
		else {
			temp[k] = v[j];
			j++;
		}
		
	for(k = l; k < r; k ++) 
		v[k] = temp[k];
}

void quick_sort(vector <int> &a, int l, int r) {
	if(r-l <= 1) return;
	
	int m = l + (r-l)/2;
	swap(a[l], a[m]);
	int i = l+1, j = r;
	while(i < j) 
		if(a[i] <= a[l])
			i++;
		else {
			j--;
			swap(a[i], a[j]);
		}
	swap(a[l], a[i-1]);
	
	quick_sort(a, l, i-1);
	quick_sort(a, i, r);
}

void quick_sort_better(vector <int> &a, int l, int r) {
	if(r-l <= 1) return;
	
	int m = l + (r-l)/2;
	swap(a[l], a[m]);
	
	//inv: a[l+1..i)<a[l], a[i..j) = a[l], a[j..k)=?, a[k..r)>a[l]
	int i = l+1, j = l+1, k = r;
	while(j < k) {
		if(a[j] < a[l]) {
			swap(a[i], a[j]);
			i++; j++;
		}
		else if(a[j] == a[l]) 
			j++;
		else {
			k--;
			swap(a[j], a[k]);
		}
	}
	swap(a[l], a[i-1]);
	
	quick_sort_better(a, l, i-1);
	quick_sort_better(a, j, r);
}
	
		
#include <fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");

int main() {
	
	int N, x, i;
	f>>N;
	vector <int> v, temp(N);
	while(N--) {
		f>>x;
		v.push_back(x);
	}
	quick_sort_better(v, 0, v.size());
	
	for(i=0; i<v.size(); i++) 
		g<<v[i]<<' ';
}