Estoy tratando de mejorar mi C++ creando un programa que tomará una gran cantidad de números entre 1 y 10^6. Los depósitos que almacenarán los números en cada pasada son una matriz de nodos (donde el nodo es una estructura que he creado que contiene un valor y un próximo atributo de nodo).Clase de raíz implementada en C++
Después de clasificar los números en cubos de acuerdo con el valor menos significativo, tengo el final de un punto de depósito al comienzo de otro cubo (para poder obtener rápidamente los números sin interrumpir el orden). Mi código no tiene errores (ya sea compilación o tiempo de ejecución), pero me he topado con una pared con respecto a cómo voy a resolver las 6 iteraciones restantes (ya que conozco el rango de números).
El problema que estoy teniendo es que inicialmente los números se suministraron a la función radixSort en forma de una matriz int. Después de la primera iteración de la clasificación, los números ahora se almacenan en la matriz de estructuras. ¿Hay alguna forma de que pueda volver a trabajar mi código para que tenga solo un ciclo for para las 7 iteraciones, o necesitaré uno para el ciclo que se ejecutará una vez, y otro ciclo debajo de él que se ejecutará 6 veces antes de devolverlo completamente ordenado? ¿lista?
#include <iostream>
#include <math.h>
using namespace std;
struct node
{
int value;
node *next;
};
//The 10 buckets to store the intermediary results of every sort
node *bucket[10];
//This serves as the array of pointers to the front of every linked list
node *ptr[10];
//This serves as the array of pointer to the end of every linked list
node *end[10];
node *linkedpointer;
node *item;
node *temp;
void append(int value, int n)
{
node *temp;
item=new node;
item->value=value;
item->next=NULL;
end[n]=item;
if(bucket[n]->next==NULL)
{
cout << "Bucket " << n << " is empty" <<endl;
bucket[n]->next=item;
ptr[n]=item;
}
else
{
cout << "Bucket " << n << " is not empty" <<endl;
temp=bucket[n];
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=item;
}
}
bool isBucketEmpty(int n){
if(bucket[n]->next!=NULL)
return false;
else
return true;
}
//print the contents of all buckets in order
void printBucket(){
temp=bucket[0]->next;
int i=0;
while(i<10){
if(temp==NULL){
i++;
temp=bucket[i]->next;
}
else break;
}
linkedpointer=temp;
while(temp!=NULL){
cout << temp->value <<endl;
temp=temp->next;
}
}
void radixSort(int *list, int length){
int i,j,k,l;
int x;
for(i=0;i<10;i++){
bucket[i]=new node;
ptr[i]=new node;
ptr[i]->next=NULL;
end[i]=new node;
}
linkedpointer=new node;
//Perform radix sort
for(i=0;i<1;i++){
for(j=0;j<length;j++){
x=(int)(*(list+j)/pow(10,i))%10;
append(*(list+j),x);
printBucket(x);
}//End of insertion loop
k=0,l=1;
//Linking loop: Link end of one linked list to the front of another
for(j=0;j<9;j++){
if(isBucketEmpty(k))
k++;
if(isBucketEmpty(l) && l!=9)
l++;
if(!isBucketEmpty(k) && !isBucketEmpty(l)){
end[k]->next=ptr[l];
k++;
if(l!=9) l++;
}
}//End of linking for loop
cout << "Print results" <<endl;
printBucket();
for(j=0;j<10;j++)
bucket[i]->next=NULL;
cout << "End of iteration" <<endl;
}//End of radix sort loop
}
int main(){
int testcases,i,input;
cin >> testcases;
int list[testcases];
int *ptr=&list[0];
for(i=0;i<testcases;i++){
cin>>list[i];
}
radixSort(ptr,testcases);
return 0;
}
Sin ofender, pero el código tiene un buen ejemplo de cómo hacer las cosas simples complicadas ;-) – hirschhornsalz