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>