J'essaye d'améliorer mon C++ en créant un programme qui prendra une grande quantité de nombres entre 1 et 10^6. Les compartiments qui stockent les nombres dans chaque passage sont un tableau de noeuds (où noeud est une structure que j'ai créée contenant une valeur et un attribut de noeud suivant). Après avoir trié les nombres dans des compartiments selon la valeur la moins significative, j'ai la fin d'un point de seau au début d'un autre seau (de sorte que je puisse rapidement stocker les nombres sans perturber l'ordre). Mon code n'a pas d'erreurs (compilation ou exécution), mais j'ai frappé un mur concernant la façon dont je vais résoudre les 6 itérations restantes (puisque je connais la plage de nombres).Radix Sort implémenté en C++
Le problème que j'ai, c'est qu'au début, les nombres ont été fournis à la fonction radixSort sous la forme d'un tableau int. Après la première itération du tri, les nombres sont maintenant stockés dans le tableau des structures. Est-il possible que je puisse retravailler mon code de sorte que je n'ai qu'une seule boucle pour les 7 itérations, ou aurai-je besoin d'une boucle qui sera exécutée une fois, et une autre qui sera exécutée 6 fois avant de renvoyer complètement le tri liste?
#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;
}
Aucune infraction, mais votre code ressemble à un bon exemple comment faire des choses simples compliquées ;-) – hirschhornsalz