Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

c++ Sortierverfahren

Hallo,

und zwar soll ich für die Schule ein Programm schreiben, was die gängigen Sortierverfahren miteinander vergleicht. nun hab ich aber eine Frage.

So sieht meine Ausgabe aus:
 
-----------------------------------------
| QuickSort:            |       0.02    |
-----------------------------------------
| BubbleSort:           |       61.72   |
-----------------------------------------
| Insertionsort:        |       0       |
-----------------------------------------
| Selectionsort:        |       16.89   |
-----------------------------------------
| Shellsort:            |       0.09    |
-----------------------------------------
 
 
 


Würde nun gerne diese einzelnen Sortierverfahren noch gerne Sortieren, wie funktiiert das? nur die Werte sortieren, könnte ich mir eher vorstellen aber die namen müssten ja zu den zeiten passen...

ach so eine leichte erklärung bitte, hab von sowas keine ahnung...


Antworten zu c++ Sortierverfahren:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

?! Was genau ist jetzt Dein Problem? Sollst Du alle diese Sortieralgorithmen programmieren oder nur diese Liste sortieren?

Wenn ersteres: Viel Spaß  ;D
Ansonsten: Schnapp Dir einfach ein Sortieralgoritmus Deiner Wahl (den Ihr am besten auch behandelt habt) und sortiere. BubbleSort wäre aufgrund der wenigen Einträge wohl das einfachste.
Wegen Deines "Zuordnungs-Problems": Mach einfach zwei Arrays, die so aussehen:

char* name[5]; //hier die Namen rein
float aufwand[5]; //hier der Rechenaufwand des jeweiligen eintrags
Nun sortierst Du die Aufwände und immer wenn Du (am Beispiel BubbleSort) zwei Aufwandseinträge tauschst, tauschst Du auch die entsprechenden Einträge im Namen-Array.

Gruß Spawn
« Letzte Änderung: 04.05.05, 13:51:15 von Spawn »

Hm, das mit den Array könnte klappen, wenn ich es verstanden hätte...

hier mein code, dann kannste vielleicht besser verstehen:

#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<math.h>

#define MAX 50000

using namespace std;

class CSort
{
private:
int zahl[MAX];
int originalzahl[MAX];
public:
void ziehen();
void kopieren();
void ausgeben();

void bubble_sort();
void quick_sort(int, int);
void dir_einfuegen();
void dir_auswahl();
void shell_sort();
};

/*Hier werden die Zufallszahlen gezogen. Die Obergrenze ist unter MAX definiert (in diesem Fall 50000)*/
void CSort::ziehen()
{
 for(int i=0; i<MAX;i++)
  originalzahl=rand()%MAX;
}
/*Hier werden die Zufallszahlen kopiert, damit jedes Sortiervefahren die selben Zahlen nutzt und nicht die Zahlen benutzt werden, die ein anderes Sortierverfahren vorher schon sortiert hatte. Diese Funktion muss immer aufgerufen werden, bevor eine Sortierfunktion aufgerufen wird.*/
void CSort::kopieren()
{
 for(int i=0; i<MAX;i++)
  zahl=originalzahl;
}

void CSort::bubble_sort()
{
int speicher;
 for(int j=0; j<MAX;j++)
 for(int i=0; i<MAX-1; i++)
 if(zahl>zahl[i+1])
   {
   speicher=zahl;
   zahl=zahl[i+1];
   zahl[i+1]=speicher;
   }
}

void CSort::quick_sort(int links, int rechts)
{
 int i=links,k=rechts,speicher, zahl_mitte;
  zahl_mitte=zahl[(links+rechts)/2];
 do {
 while (zahl<zahl_mitte)
 i++;
 while (zahl_mitte<zahl[k])
 k--;
 if(i<=k)
   {
   speicher = zahl;
   zahl = zahl[k];
   zahl[k] = speicher;
   i++;
   k--;
   }
} while (i<=k);
if(links<k)
quick_sort(links,k);
if(i<rechts)
quick_sort(i, rechts);
}


void CSort::dir_einfuegen()
{
int k, speicher;
for (int i=1; i<MAX; i++)
   {
   speicher=zahl;
   k=1;
   while(speicher<zahl[k-1])
      {
      zahl[k]=zahl[k-1];
      k--;
      if(k==0)
      break;
      }
   zahl[k]=speicher;
   }
}

void CSort::dir_auswahl()
{
   int min,j,speicher;
   for(int i=0;i<MAX-1;i++)
   {
      min=i;
      for(j=i+1;j<MAX;j++)
         if(zahl[j]<zahl[min])
            min=j;
         speicher=zahl;
         zahl=zahl[min];
         zahl[min]=speicher;
      }
   }
   
void CSort::shell_sort()
{
   int h=1,speicher,j,i;
   for(h=1;h<=MAX/9;h=h*3+1);
      for(; h>0;h/=3)
         for(i=h;i<MAX;i++)
         {
            speicher=zahl;j=i;
            while(j>=h&&zahl[j-h]>speicher)
            {
               zahl[j]=zahl[j-h];
               j-=h;
            }
            zahl=speicher;
         }
}
   

void CSort::ausgeben()
{
 for(int i=0; i<MAX;i++)
  cout<<zahl<<endl;
}

int main()
{
double zeitdauer_b, zeitdauer_q, zeitdauer_d, zeitdauer_h, zeitdauer_a, zeitdauer_s;
clock_t anfang, ende;
srand((unsigned)time(NULL));
time_t timer=time(NULL);
CSort meineZahlen;

meineZahlen.ziehen();
cout<<" "<<endl<<endl<<endl;
cout.width(41);
   cout.fill('-');
   cout<<""<<endl;
   
meineZahlen.kopieren();
anfang=clock();
meineZahlen.quick_sort(0, MAX-1);
ende=clock();
zeitdauer_q=(double)(ende-anfang)/CLOCKS_PER_SEC;
cout<<"| QuickSort:      |   "<<zeitdauer_q<<"   |"<<endl;

cout.width(41);
   cout.fill('-');
   cout<<""<<endl;
   
meineZahlen.kopieren();
anfang=clock();
meineZahlen.bubble_sort();
ende=clock();
zeitdauer_b=(double)(ende-anfang)/CLOCKS_PER_SEC;
cout<<"| BubbleSort:      |   "<<zeitdauer_b<<"   |"<<endl;

cout.width(41);
   cout.fill('-');
   cout<<""<<endl;
   
meineZahlen.kopieren();
anfang=clock();
meineZahlen.dir_einfuegen();
ende=clock();
zeitdauer_d=(double)(ende-anfang)/CLOCKS_PER_SEC;
cout<<"| Insertionsort:   |   "<<zeitdauer_d<<"   |"<<endl;

cout.width(41);
   cout.fill('-');
   cout<<""<<endl;

meineZahlen.kopieren();
anfang=clock();
meineZahlen.dir_auswahl();
ende=clock();
zeitdauer_a=(double)(ende-anfang)/CLOCKS_PER_SEC;
cout<<"| Selectionsort:   |   "<<zeitdauer_a<<"   |"<<endl;

cout.width(41);
   cout.fill('-');
   cout<<""<<endl;
   
meineZahlen.kopieren();
anfang=clock();
meineZahlen.shell_sort();
ende=clock();
zeitdauer_s=(double)(ende-anfang)/CLOCKS_PER_SEC;
cout<<"| Shellsort:      |   "<<zeitdauer_s<<"   |"<<endl;

cout.width(41);
   cout.fill('-');
   cout<<""<<endl<<endl<<endl;

// meineZahlen.ausgeben();
 
}

Die cout ausgaben würde ich halt gerne sortieren, nach der jeweiligen zeit, die gebraucht wurde... hoffe ist nun verständlicher geworden...

So nicht: ::)

Zitat
Wegen Deines "Zuordnungs-Problems": Mach einfach zwei Arrays, die so aussehen:
char* name[5]; //hier die Namen rein
float aufwand[5]; //hier der Rechenaufwand des
jeweiligen eintrags

Eher irgendwie so:
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<math.h>

#include <algorithm>
#include <vector>

#define MAX 50000

using namespace std;

class CSort
{
   private:
      int zahl[MAX];
      int originalzahl[MAX];
   public:
      void ziehen();
      void kopieren();
      void ausgeben();

      void bubble_sort();
      void quick_sort(int, int);
      void dir_einfuegen();
      void dir_auswahl();
      void shell_sort();
};

/*Hier werden die Zufallszahlen gezogen. Die Obergrenze ist unter MAX definiert (in diesem Fall 50000)*/
void CSort::ziehen()
{
   for(int i=0; i<MAX;i++)
      originalzahl[i]=rand()%MAX;
}
/*Hier werden die Zufallszahlen kopiert, damit jedes Sortiervefahren die selben Zahlen nutzt und nicht die Zahlen benutzt werden, die ein anderes Sortierverfahren vorher schon sortiert hatte. Diese Funktion muss immer aufgerufen werden, bevor eine Sortierfunktion aufgerufen wird.*/
void CSort::kopieren()
{
   for(int i=0; i<MAX;i++)
      zahl[i]=originalzahl[i];
}

void CSort::bubble_sort()
{
   int speicher;
   for(int j=0; j<MAX;j++)
      for(int i=0; i<MAX-1; i++)
         if(zahl[i]>zahl[i+1])
         {
            speicher=zahl[i];
            zahl[i]=zahl[i+1];
            zahl[i+1]=speicher;
         }
}

void CSort::quick_sort(int links, int rechts)
{
   int i=links,k=rechts,speicher, zahl_mitte;
   zahl_mitte=zahl[(links+rechts)/2];
   do {
      while (zahl[i]<zahl_mitte)
         i++;
      while (zahl_mitte<zahl[k])
         k--;
      if(i<=k)
      {
         speicher = zahl[i];
         zahl[i] = zahl[k];
         zahl[k] = speicher;
         i++;
         k--;
      }
   } while (i<=k);
   if(links<k)
      quick_sort(links,k);
   if(i<rechts)
      quick_sort(i, rechts);
}


void CSort::dir_einfuegen()
{
   int k, speicher;
   for (int i=1; i<MAX; i++)
   {
      speicher=zahl[i];
      k=1;
      while(speicher<zahl[k-1])
      {
         zahl[k]=zahl[k-1];
         k--;
         if(k==0)
            break;
      }
      zahl[k]=speicher;
   }
}

void CSort::dir_auswahl()
{
   int min,j,speicher;
   for(int i=0;i<MAX-1;i++)
   {
      min=i;
      for(j=i+1;j<MAX;j++)
         if(zahl[j]<zahl[min])
            min=j;
      speicher=zahl[i];
      zahl[i]=zahl[min];
      zahl[min]=speicher;
   }
}
   
void CSort::shell_sort()
{
   int h=1,speicher,j,i;
   for(h=1;h<=MAX/9;h=h*3+1);
   for(; h>0;h/=3)
      for(i=h;i<MAX;i++)
      {
            speicher=zahl[i];j=i;
            while(j>=h&&zahl[j-h]>speicher)
            {
            zahl[j]=zahl[j-h];
            j-=h;
            }
            zahl[i]=speicher;
      }
}
   

void CSort::ausgeben()
{
   for(int i=0; i<MAX;i++)
      cout<<zahl[i]<<endl;
}

struct SortData
{
   public:
      SortData( double t, char *name )
      {
         m_t = t;
         m_name = name;
      }
      
      double m_t;
      char *m_name;
};

struct SortDataSort
{
      bool operator()(SortData* a, SortData* b )
      {
         return a->m_t < b->m_t;
      }
};

int main()
{
   double zeitdauer_b, zeitdauer_q, zeitdauer_d, zeitdauer_h, zeitdauer_a, zeitdauer_s;
   clock_t anfang, ende;
   srand((unsigned)time(NULL));
   time_t timer=time(NULL);
   CSort meineZahlen;
   vector<SortData*> sorts;

   meineZahlen.ziehen();
   
   meineZahlen.kopieren();
   anfang=clock();
   meineZahlen.quick_sort(0, MAX-1);
   ende=clock();
   sorts.push_back(new SortData((double)(ende-anfang)/CLOCKS_PER_SEC, "QuickSort" ));

   
   meineZahlen.kopieren();
   anfang=clock();
   meineZahlen.bubble_sort();
   ende=clock();
   sorts.push_back(new SortData((double)(ende-anfang)/CLOCKS_PER_SEC, "BubbleSort" ));

   
   meineZahlen.kopieren();
   anfang=clock();
   meineZahlen.dir_einfuegen();
   ende=clock();
   sorts.push_back(new SortData((double)(ende-anfang)/CLOCKS_PER_SEC, "InsertionSort"));


   meineZahlen.kopieren();
   anfang=clock();
   meineZahlen.dir_auswahl();
   ende=clock();
   sorts.push_back(new SortData((double)(ende-anfang)/CLOCKS_PER_SEC, "SelectionSort"));

   
   meineZahlen.kopieren();
   anfang=clock();
   meineZahlen.shell_sort();
   ende=clock();
   sorts.push_back(new SortData((double)(ende-anfang)/CLOCKS_PER_SEC, "ShellSort"));

   sort(sorts.begin(),sorts.end(),SortDataSort());

   for( vector<SortData*>::iterator it = sorts.begin(); it!=sorts.end();++it )
   {
      cout << (*it)->m_name << "\t" << (*it)->m_t << "\n";
   }
// meineZahlen.ausgeben();

}

thx

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Da hatte ich wohl was falsch verstanden  :-[

Nunja, hat sich ja geklärt  :)


« Künstiche inteligensjava_dateien »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Directory
Ordner im Dateisystem eines Computers. Siehe auch Ordner ...