Dev - C++ - Programa ejecuta a medias

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Programa ejecuta a medias

Publicado por A3434 (1 intervención) el 19/05/2021 05:43:09
Hola buenas, el código ejecuta un QuickSelect modificado, donde n es el número de elementos de un arreglo cualquiera y k representa los k números menores a buscar, que posteriormente se almacena en un arreglo B, el problema que tengo que es lo ejecuta correctamente (hace la función) para valores de n y k pequeños ,pero cuando les pongo valores como 100 000 para n y 50 000 para k el código ejecuta por unos momentos y luego se detiene, puse unos cout para ver el valor del pivote (p) y me di cuenta que se forman ciclos ej: 590 1100 1500 y luego el k decrece de uno en uno, hasta que de a poco el p se iguala con el k, cuando los números son grandes esos ciclos también lo son, y el k decrece lentamente hasta que de cierta forma el programa dice "basta" y termina la ejecución, y bueno, llevo un par de días pero no logro entender que lo hace fallar concretamente...

Ej de ejecución:
A[2, 4, 6, 1, 7, 9] -> arreglo aleatorio; n=6
B[k celdas] ->almacena k menores; si k=2 y se ejecuta el quickSelect => B[1, 2]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <bits/stdc++.h>
using namespace std;
 
int partition(int *a,int l, int r){
	int piv=a[l];
	int p=l;
	for (int i=l+1;i<=r;i++){
		if(a[i]<=piv){
			p=p+1;
			swap(a[i],a[p]);
		}
	}
	swap(a[l],a[p]);
	return p;
}
 
 
int quickSelect(int *A,int *B,int l, int r, int k){
 
	if((l>=r) && (k==0)){
		B[k]=A[l];
		cout<<"QuickSelect exitoso."<<endl;
		return 0; //finaliza
	}
	int p=partition(A,l,r);
	//cout<<"p : "<<p<<" k : "<<k<<endl;
	if (k==p+1){
		B[p]=A[p];
		return quickSelect(A,B,0,p-1,k-1);
	}
 
	if (k<p+1){
		//cout<<"p< : "<<p<<" k : "<<k<<endl;
		return quickSelect(A,B,l,p-1,k); //se busca igualar el pivote+1 con k
	}
	//cout<<"p> : "<<p<<" k : "<<k<<endl;
	return quickSelect(A,B,p+1,r,k);
 
 
}
 
void imprimeArr(int *A,int n){
	cout<<endl;
	for (int i=0;i<n;i++){
		cout<<A[i]<<" ";
	}
	cout<<endl;
}
void matrizRandom(int *A,int n){
	for (int i=0;i<n;i++){
		A[i]=rand() % (50)+1;
		//cout<<A[i]<<" ";
	}
	cout<<"Matriz aleatoria creada."<<endl;
}
int main(){
	int k = 50000;int *masPeque = new int[k];
	int n=100000;int *arrayToSearch= new int[n];
 
	matrizRandom(arrayToSearch,n);
 
	quickSelect(arrayToSearch,masPeque,0,n-1,k);
	cout<<endl;
 
	imprimeArr(masPeque,k);
 
	cout<<endl;
 
 
    return 0;
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder