Pagini recente » Cod sursa (job #444162) | Monitorul de evaluare | Cod sursa (job #1769923) | Cod sursa (job #1502587) | Cod sursa (job #2276469)
#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;
}