Cod sursa(job #1010535)

Utilizator space.foldingAdrian Soucup space.folding Data 15 octombrie 2013 02:15:39
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <algorithm>
#include <cstdio>
#include <iterator>
#include <cassert>

using namespace std;

// Most significant digit radix sort (recursive)
void MSDRadix ( int arr[], int begin, int end, int msb = 31 ) {
	if (begin != end && msb >= 0) {
		int mid = std::partition(arr + begin, arr + end, [&msb](int value){if (msb == 31) return value < 0; else return !(value & (1 << msb));  }) - arr;
		--msb; // decrement most-significant-bit
		MSDRadix(arr, begin, mid, msb); // sort left partition
		MSDRadix(arr, mid, end, msb); // sort right partition
	}
}

void QuickSort( int arr[], int begin, int end ) {
	
	if(begin >= end)
		return;

	int pivot = arr [(begin + end - 1) >> 1];
	
	std::swap(arr [(begin + end - 1) >> 1], arr[end - 1]);
	int mid = std::partition ( arr + begin, arr + end - 1, [&pivot] (int value) { return value < pivot; } ) - arr;	
	std::swap(arr[mid], arr[end - 1]);


	QuickSort(arr, begin, mid);
	QuickSort(arr, mid + 1, end);
}

void Merge(int a[], int begin, int mid, int end) {
	
	int i = begin;
	int j = mid;
	int k = 0;
	int *temp = new int[end - begin];

	while (i < mid && j < end) {
		if (a[i] <= a[j])
			temp[k++] = a[i++];			
		else
			temp[k++]=a[j++];		
	}

	for (int l = i; l < mid; ++l)
		temp[k++] = a[l];	

	for (int l = j; l < end; ++l)
		temp[k++] = a[l];

	for (int l = begin; l < end; ++l)
		a[l] = temp[l - begin];
	
	delete[] temp;
}

void MergeSort(int a[], int begin, int end) {
	if (begin < end - 1)	{
		int mid = (begin + end) / 2;
		MergeSort(a, begin, mid);
		MergeSort(a, mid, end);
		Merge(a, begin, mid, end);
	}
}


int const MAX = 500009;
int data[MAX], dataSize;





int main () {
	FILE *fin = fopen("algsort.in", "r");
	FILE *fout = fopen("algsort.out", "w");

	fscanf(fin, "%d", &dataSize);


	for(int i = 0; i < dataSize; ++i)
		fscanf(fin, "%d", data + i);


	QuickSort(data, 0, dataSize);


	for(int i = 0; i < dataSize; ++i)
		fprintf(fout, "%d ", data[i]);

	fclose(fin);
	fclose(fout);
	return 0;

}