Pagini recente » Cod sursa (job #1497100) | Cod sursa (job #1135189) | Cod sursa (job #634714) | Cod sursa (job #680143) | Cod sursa (job #1017556)
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
int n, k, v[3000000];
void citire()
{
cout << "n = "; cin >> n;
cout << "k = "; cin >> k;
for(int i=1; i<=n; i++)
{
cout << "v" << i << " = ";
cin >> v[i];
}
}
void afisare()
{
cout << endl;
for(int i=1; i<=n; i++)
cout << v[i] << ' ';
cout << endl;
}
int piv_aleat(int a, int b) // generam un indice pseudo-aleator
{
int p1, p2, p3, aux, mic, mare; // defapt generam 3 indici si il alegem pe cel cu val mijlocie
srand(time(NULL)); // randomizam
p1 = v[rand()%b + a]; // nr aleator din intervalul [a,b]
p2 = v[rand()%b + a];
p3 = v[rand()%b + a];
aux = p1<p2 ? p1 : p2; // min(p1,p2)
mic = aux < p3 ? aux : p3; // min( min(p1,p2) , p3)
aux = p1>p2 ? p1 : p2; // max(p1,p2)
mare = aux > p3 ? aux : p3; // max( max(p1,p2) , p3)
return p1+p2+p3 - mic - mare; // le adunam pe toate si le scadem pe cel mare si cel mic, ramanand mijlociul
}
void stat_de_ord(int a=1, int b=n) // quicksort modificat
{
int i=a, j=b, p=piv_aleat(a,b); // v[i=a ... p ... j = b]
while(i <= j) // cat timp i nu a ajuns la j
{
while(v[i] < p) i++; // crestem i pana ajungem la pivot
while(v[j] > p) j--; // scadem j pana la pivot
if(i <= j) // daca elementele la care ne-am oprit sunt de parti opuse ale pivotului
{
int aux = v[i];
v[i] = v[j]; // le interschimbam valorile
v[j] = aux;
i++; j--; // si le lasam sa continue drumul
}
}
if (k <= j && a < j) stat_de_ord(a,j); // apelam QS in subvectorul din stanga
else if (k > j && i < b) stat_de_ord(i,b); // apelam QS in dreapta
}
int main()
{
ifstream f ("sdo.in");
ofstream g ("sdo.out");
f >> n >> k;
for(int i=1; i<=n; i++) f >> v[i];
stat_de_ord();
g << v[k];
return 0;
}