Cod sursa(job #2276469)

Utilizator richard26Francu Richard richard26 Data 4 noiembrie 2018 19:21:44
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

int mid(int left, int right, int arr[])
{
	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]) ? arr[r2]:arr[r3]);

	if(arr[r2] <= arr[1] && arr[r2] <= arr[r3])
		return ( (arr[r3] < arr[r1]) ? arr[r3]:arr[r1]);

	if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
		return ( (arr[2] < arr[1]) ? arr[2]:arr[1]);

}

int swp(int &a, int &b)
{
	int aux = a;
	a = b;
	b = aux;
}
int partition(int left, int right, int arr[])
{
	int s = mid(left, right, arr);
	int pivot = arr[right];
	int i = left;
	for(int j = left; j < right; j++)
	{
		if(arr[j] <= pivot)
		{
			if(i != j) {
				swp(arr[j], arr[i]);
			}
			i++;
		}

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

}
int main()
{   
	
	int i, n, k, arr[100001];
	f>>n>>k;
	for(i = 1; i <= n; i++) f>>arr[i];
	g<<kel(1, n, arr, k);
    return 0;

}