Cod sursa(job #2278419)

Utilizator richard26Francu Richard richard26 Data 7 noiembrie 2018 23:54:22
Problema Statistici de ordine Scor 70
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int arr[3000001];
void swp(int * a, int * b)
{
	int aux = *a;
	*a = *b;
	*b = aux;

}

int mid(int left, int right)
	
	
	
{
	
	
	
	int r1 = rand() % (right - left + 1) + left;
	
	
	
	int r2 = rand() % (right - left + 1) + left;
	
	
	
	int r3 = rand() % (right - left + 1) + left;
	
	
	
 
	
	
	
	if(arr[r1] <= arr[r2] && arr[r1] <= arr[r3])
	
	
	
		return ( (arr[r2] < arr[r3]) ? r2:r3);
	
	
	
 
	
	
	
	if(arr[r2] <= arr[1] && arr[r2] <= arr[r3])
	
	
	
		return ( (arr[r3] < arr[r1]) ? r3:r1);
	
	
	
 
	
	
	
	if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
	
	
	
		return ( (arr[2] < arr[1]) ? r2:r1);
	
	
	
 
	
	
	
}
	
	
int partition(int left, int right)
{
	int s = mid(left, right);
    swp(&arr[s], &arr[right]);
    int pivot = arr[right];
    int i = left;
    for (int j = left; j < right; j++){
    	if(arr[j] < pivot){
    		if (i != j){
    			swp(&arr[i], &arr[j]);
    		}
    		i++;
    	}
    }
    swp(&arr[right], &arr[i]);
    return i;

}
int kel(int left, int right, int k)
{
	
    int p = partition(left, right);
    if (p == k) return arr[k];
    if (p < k) kel(p + 1, right, k);
     else kel(left, p - 1, k);

   
}
int main()
{
	FILE *f, *g;
	f = fopen("sdo.in", "r");
	g = fopen("sdo.out", "w");
	srand( time(NULL));
	
	int n, k;

	fscanf(f,"%d%d", &n, &k);
	for (int i = 1; i <= n; i++) fscanf(f, "%d", &arr[i]);
	int x = kel(1, n, k);
	fprintf(g,"%d",x);
	return 0;
	
}