Cod sursa(job #2225469)

Utilizator AraldaAralda Pacurar Aralda Data 27 iulie 2018 12:25:15
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int sir[3000001];

int part(int stg, int dr) {

	int pivot = sir[stg];
	int i = stg - 1;
	int j = dr + 1;

	while (1) {

		do {

			j--;

		} while (sir[j] >= pivot);

		do {

			i++;

		} while (sir[i] <= pivot);

		if (i < j) {

			int aux = sir[i];
			sir[i] = sir[j];
			sir[j] = aux;
		}
		else {

			return j;
		}
	}
}

int random_part(int stg, int dr) {

	int r = rand() % (dr + 1);

	int aux = sir[stg];
	sir[stg] = sir[r];
	sir[r] = aux;

	return part(stg, dr);
}

int quick_select(int stg, int dr, int k) {

	if (stg == dr) {

		return sir[stg];
	}

	int index = random_part(stg, dr);
	int len = index - stg + 1;

	if (k < len) {

		return quick_select(stg, index, k);
	}
	else {

		return quick_select(index + 1, dr, k - len);
	}

}

int main() {

	FILE* ip;
	FILE* op;

	ip = fopen("sdo.in", "r");
	if (ip == NULL) {

		perror("Error opening input file");
		return 1;
	}

	op = fopen("sdo.out", "w");
	if (op == NULL) {

		perror("Error opening output file");
		return 1;
	}

	int n, k;
	fscanf(ip, "%d%d", &n, &k);

	for (int i = 0; i < n; i++) {
		
		fscanf(ip, "%d", &sir[i]);
	}

	fprintf(op, "%d", quick_select(0, n - 1, k - 1)); //k - 1 pt. ca sirul e indexat de la 0

	fclose(ip);
	fclose(op);

	return 0;
}