Sto cercando di migliorare il mio C++ creando un programma che richiederà una grande quantità di numeri tra 1 e 10^6. I bucket che memorizzeranno i numeri in ogni passaggio sono una serie di nodi (dove node è una struct che ho creato contenente un valore e un successivo attributo node).Ordinamento Radix implementato in C++
Dopo aver ordinato i numeri in bucket in base al valore meno significativo, ho la fine di un punto bucket all'inizio di un altro bucket (in modo da poter ottenere rapidamente i numeri memorizzati senza interrompere l'ordine). Il mio codice non ha errori (né di compilazione né di runtime), ma ho colpito un muro riguardo a come sto andando a risolvere le restanti 6 iterazioni (poiché conosco l'intervallo di numeri).
Il problema che sto avendo è che inizialmente i numeri venivano forniti alla funzione radixSort sotto forma di un array int. Dopo la prima iterazione dell'ordinamento, i numeri vengono ora memorizzati nella matrice di strutture. C'è un modo per rielaborare il mio codice in modo da avere solo un ciclo for per le 7 iterazioni, o avrò bisogno di un ciclo for che verrà eseguito una volta, e un altro ciclo al di sotto di esso che verrà eseguito 6 volte prima di tornare completamente ordinato elenco?
#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;
}
Senza offesa, ma il codice sembra un buon esempio come fare le cose semplici complicate ;-) – hirschhornsalz