Cod sursa(job #1034395)

Utilizator RyuchetvalPopescu Valentin Ryuchetval Data 17 noiembrie 2013 20:05:06
Problema Statistici de ordine Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#include <stdlib.h>

void CopyArray(int B[], int iBegin, int iEnd, int A[])
{
	while (iBegin < iEnd)
	{
		A[iBegin] = B[iBegin];
		iBegin++;
	}
}
void TopDownMerge(int A[], int iBegin, int iMiddle, int iEnd, int B[])
{
	int i0 = iBegin, i1 = iMiddle, j;

	// While there are elements in the left or right runs
	for (j = iBegin; j < iEnd; j++) {
		// If left run head exists and is <= existing right run head.
		if (i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1]))
			B[j] = A[i0++];  // Increment i0 after using it as an index.
		else
			B[j] = A[i1++];  // Increment i1 after using it as an index.
	}
}
void TopDownSplitMerge(int A[], int iBegin, int iEnd, int B[])
{
	if (iEnd - iBegin < 2)                       // if run size == 1
		return;                                 //   consider it sorted
	// recursively split runs into two halves until run size == 1,
	// then merge them and return back up the call chain
	int iMiddle = (iEnd + iBegin) / 2;              // iMiddle = mid point
	TopDownSplitMerge(A, iBegin, iMiddle, B);  // split / merge left  half
	TopDownSplitMerge(A, iMiddle, iEnd, B);  // split / merge right half
	TopDownMerge(A, iBegin, iMiddle, iEnd, B);  // merge the two half runs
	CopyArray(B, iBegin, iEnd, A);              // copy the merged runs back to A
}
void TopDownMergeSort(int A[],int B[],int n)
{
	TopDownSplitMerge(A, 0, n, B);
	return;
}




int main()
{
    FILE *IN = fopen("sdo.in", "r");
     FILE *OUT = fopen("sdo.out","w+");
	int V[100], n,i,C[100],k;
	fscanf(IN,"%d %d",&n,&k);
	for (i=0;i<n;i++)
        fscanf(IN,"%d",&V[i]);
	/*printf("n:");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		printf("V[%d]:", i);
		scanf("%d", &V[i]);
	}*/
	TopDownMergeSort(V, C, n);
	fprintf(OUT,"%d",C[k-1]);

	return 0;
}