Radix-Sort in C++implementiert werden
Ich versuche mich zu verbessern, mein C++ Programm erstellen, der eine große Menge von zahlen zwischen 1 und 10^6. Die Eimer, die speichern die zahlen, die in jedem Durchlauf ein array von Knoten (wo der Knoten ist eine Struktur, die ich erstellt mit einem Wert und einem next-Knoten-Attribut).
Nach dem Sortieren der zahlen in den Eimer nach den zuletzt deutlichen Mehrwert, ich habe am Ende von einem Eimer auf den Anfang noch einen Eimer (so dass ich schnell die zahlen gespeichert werden, ohne Unterbrechung der Reihenfolge). Mein code hat keine Fehler (entweder compile-oder Laufzeit -), aber ich habe eine Wand schlagen zu wie ich dabei bin zu lösen, die restlichen 6 Iterationen (da ich weiß, dass die Reihe von zahlen).
Das problem, dass ich habe ist, dass zunächst die zahlen, die geliefert wurden, sind die radixSort-Funktion in form eines int-array. Nach der ersten iteration der Sortierung, die zahlen sind jetzt gespeichert in dem array von Strukturen. Gibt es eine Möglichkeit, dass ich könnte arbeiten meine code so, dass ich nur eine for-Schleife für den 7 Iterationen, oder muss ich in eine for-Schleife, die einmal ausgeführt, und eine weitere Schleife, die darunter laufen wird 6 mal vor Rücksendung der vollständig sortierten 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;
}
- Nichts für ungut, aber dein code sieht aus wie ein gutes Beispiel, wie man einfache Dinge kompliziert 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, du bist stark overcomplicating Ihre Lösung. Sie implementieren können, radix Verwendung der single-array erhalten, in dem input, mit dem Eimer in jedem Schritt dargestellt durch ein array von Indizes, markieren der Start-index der einzelnen Eimer in das Eingabe-array.
In der Tat, man könnte sogar tun es rekursiv:
Natürlich
buckets[i+1] - buckets[i]
verursachen einen buffer overflow, wenni
ist 9, aber ich hatte extra check oder Lesbarkeit Willen; ich hoffe, Sie wissen, wie Sie damit umgehen.Mit, dass Sie nur noch zu nennen
radixSort(testcases, sizeof(testcases) /sizeof(testcases[0]), 0)
und das array sortiert werden soll.Den Prozess zu beschleunigen mit einer besseren Speicher-management, erstellen Sie eine matrix für die gilt, dass konvertiert werden in die Indizes von einem einzigen pass über das array. Reservieren Sie einen zweiten temp-array der gleichen Größe wie das original-array, und radix-sort zwischen den beiden arrays, bis das array sortiert ist. Wenn eine ungerade Anzahl von radix-sort übergibt durchgeführt wird, dann wird das temp-array kopiert werden müssen zurück auf das original-array am Ende.
Weiter den Prozess zu beschleunigen, verwenden Sie base 256, statt der Basis 10 für die radix-sort. Dies dauert nur 1 scan-pass, um die matrix zu erstellen und 4 radix-sort übergibt das zu tun Art. Beispiel-code:
Da deine Werte sind Ganzzahlen im Bereich von 0 ... 1,000,000
Können Sie erstellen ein int-array der Größe 1,000,001, und die ganze Sache in zwei Durchgängen
Init dem zweiten array mit Nullen.
Machen einen Durchgang durch die Eingabe-array und den Wert als Tiefgestellt
erhöhen Sie den Wert in das zweite Feld.
Sobald Sie das tun, dann der zweite pass ist einfach.
Spaziergang durch das zweite array, und jedes element, sagt Sie, wie viele Male,
Nummer erschien im ursprünglichen array. Verwenden Sie diese Informationen, um zu bevölkern
Ihre Eingabe-array.