Cod sursa(job #791264)

Utilizator dbalutaDaniel Baluta dbaluta Data 23 septembrie 2012 16:19:00
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>
#include <stdlib.h>

int N, M;
int *v;

int search (int *v, int N, int x, int type);

void go(void)
{
	int i, type, x;
	
	FILE *f = fopen("cautbin.in", "r");
	if (!f) 
		return;
	
	fscanf(f, "%d", &N);
	
	v = malloc(N * sizeof(int));
	if (!v) 
		return;
	for (i = 0; i < N; i++) 
		fscanf(f, "%d", &v[i]);
	
	fscanf(f, "%d", &M);
	
	for (i = 0; i < M; i++) {
		fscanf(f, "%d %d", &type, &x);
		search(v, N, x, type);
	}
}

int search(int *v, int N, int x, int type)
{
	int pos;
	FILE *f = fopen("cautbin.out", "w");

	switch(type) {
	case 0:
		pos = bsearch_1(v, 0, N-1, x);
		printf("Found %d at %d\n", x, pos);
		
		while( pos < N-1 && v[pos + 1] == x)
			pos++;
		fprintf(f, "%d", pos);
			
		break;
	case 1:
		pos = bsearch_2(v, 0, N-1, x);
		while (pos >= 0 && v[pos] > x)
			pos--;
		fprintf(f, "%d", pos);
	case 2:
		pos = bsearch_2(v, 0, N-1, x);
		while (pos <  N && v[pos] < x) 
			pos++;
		fprintf(f, "%d", pos);
	default:
		break;
	}
}

int bsearch_1(int *v, int start, int stop, int x)
{
	int mid;
	
	if (start > stop) 
		return -1;
	mid = start + (stop - start)/2 ;
	
	
	printf("Caut bin %d , crt %d <- mid %d [%d - %d]\n", x, v[mid], mid, start, stop);

	if (v[mid] == x)
		return mid;
	else if (v[mid] < x) 
		return bsearch_1(v, mid + 1, stop, x);
	else
		return bsearch_1(v, start, mid - 1, x);
}
 

int bsearch_2(int *v, int start, int stop, int x)
{
	int mid;
	if (start >= stop) 
		return stop;
		
	mid = start + (stop - start) / 2;
	
	if (v[mid] == x) 
		return mid;
	
	else if (v[mid] < x) 
		return bsearch_2(v, mid + 1, stop, x);
	else
		return bsearch_2(v, start, mid - 1, x);
}


int main(void)
{
	go();

	return 0;
}