holas , les agradesco por querer ayudarme, estoy investigando algoritmos y me encontre con uno llamado bucketsort , el cuales muy interesante , encontre un codigo que genera nuemors aleatorios y trate de convinarlos, el problema al parecer es que algo hice mal al fusionar esos codigos y me arroja problemas
<br><br><br>este es el codigo:<br><br>#include <iostream><br>#include <stdio.h><br>#include <conio.h><br>#define TAM 1<br>using namespace std;<br><br>void init_mm( );// inicializa en creador de numeros aleatorios
<br>int number_range( int from, int to );<br>int number_mm( void );<br>static int rgiState[2+55]; /* Dejar esto asi */<br><br><br>class element //element <br>{<br>public:<br> int value;<br> element *next;
<br> element()<br> {<br> value=0;<br> next=NULL;<br> }<br>};<br><br>class bucket //cada bucket tiene un rango especifico de valores <br>{<br>public:<br>element *firstElement;<br>bucket()<br>{<br>
firstElement = NULL;<br>}<br>};<br>int array[TAM];<br>int main() <br>{<br> int lowend=0; // minimo elemento<br> int highend=100000000; //max elemento <br> int interval=10; //numero de intervalos
<br> const int noBuckets=(highend-lowend)/interval; //calculo de numeros de buquet requeridos <br> cout <<"el numero de buckets es:"<<noBuckets<<endl;<br> bucket *buckets = new bucket[noBuckets];
<br> bucket *temp;<br><br> for(int i=0;i<noBuckets;i++) //creando cada uno de los bucket <br> {<br> temp=new bucket;<br> buckets[i]=*temp;<br> //cout<<"array["<<i<<"]="<<array[i]<<endl;
<br> //cout<<"*temp ="<<&temp<<endl;<br> }<br><br> cout<<"--------los elementos ordenados por el metodo Bucket sort son ------------------\n";<br> init_mm(); /* inicia el generador */
<br> printf("Generando 10 numero aleatorios entre 0 y 100.000.000:\n");<br> int array[TAM];<br> for(int i=0;i<TAM;i++)<br> array[i]=number_range( 1, 100000000 );<br> cout<<"hasta aca ba bien"<<endl;
<br> //system ("pause");<br><br> for(int j=0;j<TAM;j++) //enviando elementos al bucket apropiado<br> {<br> //cout<<array[j]<<endl;<br> element *temp1,*pre;<br> temp1=buckets[array[j]/interval].firstElement;
<br> if(temp1==NULL)//si el elemto es el primero en el bucket <br> {<br> temp1=new element;<br> buckets[array[j]/interval].firstElement=temp1;<br> temp1->value=array[j];<br>
}<br> else<br> {<br> pre=NULL;<br> while(temp1!=NULL) //al salir de este while queda apuntando al lugar apropaido dentro del bucket<br> {<br> /*
<br> El problema está en que si temp es NULL, no puedes comprobar <br> temp->value>array[j], ya que para saber temp->value intenta <br> dereferenciar un puntero nulo.<br>
Sugiero cambiar la condición del if por if (temp!=NULL), <br> en cuyo caso ya funciona :-)<br> <br> */<br> if(temp1==NULL)//antes habia //if(temp->value>array[j])
<br> break;// sale de s cilo si el elemento es menro que el apuntado<br> pre=temp1;<br> temp1=temp1->next;<br> }<br> <br> //antes habia //if(temp->value>array[j])
<br> if(temp1==NULL) //if the new value is in betwen or at the begining<br> {<br> if(pre==NULL) //inserta al principio si el bucket tiene elementos ya<br> {
<br> element *firstNode;<br> firstNode=new element();<br> firstNode->value=array[j];<br> firstNode->next=temp1;<br> buckets[array[j]/interval].firstElement=firstNode;
<br> }<br> else //insercion a la mitad<br> {<br> element *firstNode;<br> firstNode=new element();<br> firstNode->value=array[j];
<br> firstNode->next=temp1;<br> pre->next=firstNode;<br> }<br> }<br> else// si el valor creado en el ultimo en el bucket
<br> {<br> temp1=new element;<br> pre->next=temp1;<br> temp1->value=array[j];<br> }<br><br> }<br> }<br><br> cout<<"------------------------la lista ordenada es---------------\n";
<br> for(int jk=0;jk<10;jk++)<br> {<br> element *temp;<br> temp= buckets[jk].firstElement;<br> while(temp!=NULL)<br> {<br> cout<<"*"<<temp->value<<endl;
<br> temp=temp->next;<br> }<br> }<br> cout<<"--------------------------------fin--------------------------------\n";<br><br>system("pause");<br><br>return 1;<br>
<br>}<br><br> int number_mm( void )<br> {<br> int *piState;//puntero a int<br> int iState1;<br> int iState2;<br> int iRand;<br> piState = &rgiState[2];<br> iState1 = piState[-2];<br>
iState2 = piState[-1];<br> iRand = ( piState[iState1] + piState[iState2] )<br> & ( ( 1 << 30 ) - 1 );<br> piState[iState1] = iRand;<br> if ( ++iState1 == 55 )<br> iState1 = 0;
<br> if ( ++iState2 == 55 )<br> iState2 = 0;<br> piState[-2] = iState1;<br> piState[-1] = iState2;<br> return iRand >> 6;<br>}//fin number-nm<br><br>/*<br>* Genera un numero aleatorio.<br>
*/<br>int number_range( int from, int to )<br> {<br> int power;<br> int number;<br> if ( ( to = to - from + 1 ) <= 1 )<br> return from;<br> for ( power = 2; power < to; power <<= 1 )<br> ;
<br> while ( ( number = number_mm( ) & ( power - 1 ) ) >= to )<br> ;<br> return from + number;<br>}//fin number_range<br><br>/*<br>* Este es el algoritmo de Mitchell-Moore del libro: Knuth Volume II.<br>*/
<br>void init_mm( )<br> {<br> int *piState;<br> int iState;<br> piState = &rgiState[2];<br> piState[-2] = 55 - 55;<br> piState[-1] = 55 - 24;<br> piState[0] = ( (int) time( NULL ) ) & ( ( 1 << 30 ) - 1 );
<br> piState[1] = 1;<br> for ( iState = 2; iState < 55; iState++ )<br><br><br> {<br> piState[iState] = ( piState[iState-1] + piState[iState-2] )<br> & ( ( 1 << 30 ) - 1 );<br>
}<br> return;<br>}//fin init_mm<br><br><br><br><br clear="all"><br><br><br>