Cod sursa(job #1010530)

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

using namespace std;

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

int Median3( int const arr[], int a, int b, int c ) {
	int ans = a;
	
	if(arr[a] <= arr[b] && arr[b] <= arr[c])
		ans = b;	
	if(arr[b] <= arr[c] && arr[c] <= arr[a])
		ans = c;

	return ans;
}

void QuickSort( int arr[], int first, int last ) {
	
	if(first >= last)
		return;


	int pivIdx = Median3(arr, first, (first + last - 1) / 2, last - 1);
	
	int pivot = arr [pivIdx];
	
	std::swap(arr [pivIdx], arr[last - 1]);
	int mid = std::partition ( arr + first, arr + last - 1, [&pivot] (int value) { return value < pivot; } ) - arr;
	std::swap(arr[mid], arr[last - 1]);


	QuickSort(arr, first, mid);
	QuickSort(arr, mid + 1, last);
}

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

	while (i < mid && j < high) {
		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 < high; l++)
		temp[k++] = a[l];

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

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


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;

}