Quicksort Code in C

Gast #4114921
Lesenswert?
• ▲
▼
hallo miteinander,

hat mit jemand den C-code für einen quicksort?

Alternativ: könntet ihr mir verraten, was an meinem falsch ist?

---------------------------------------------------------------------

int* quicksort  (int *feld, int index)
{

  int buffer = 0;
  int pivot = 0;
  int *pointer_kl;
  int *pointer_gr;
  int versatz = 0;

  if (index > 0)
  {
    pivot = feld[index/2];
    pointer_kl = feld + index;
    pointer_gr = feld;

    do
    {
      while (*pointer_gr<=pivot && pointer_gr != pointer_kl)
      {
        pointer_gr++;
      }

      while (*pointer_kl>=pivot && pointer_kl != pointer_gr)
      {
        pointer_kl--;
      }

      buffer = *pointer_gr;
      *pointer_gr = *pointer_kl;
      *pointer_kl = buffer;

    } while (pointer_gr<pointer_kl);

    versatz = pointer_gr - feld;

    if (versatz > (index/2) && feld[versatz] > pivot)
    {
      versatz = versatz-1;
    }

    feld[index/2] = feld[versatz];
    feld[versatz] = pivot;

    quicksort(feld, (versatz - 1));              //Rekursion
    quicksort(feld + (versatz + 1), index - (versatz + 1));
  }

  else
  {
    return feld;
  }


}

---------------------------------------------------------------------
Gast #4115779
Lesenswert?
• ▲
▼
stimmt habe den quicksort seperat ausprobiert und der funktioniert, dann 
muss der fehler an meiner main oder an der übergabe liegen.
Hier ist mal der komplette code, hoffe ihr erkennt den Fehler.

Wenn ich mir die zahlen ausgeben lassen kommen immer extrem hohe werte 
raus(werden wohl die adressen sein):

-------------------------------------------------------------------
#include <stdio.h>
#include<stdlib.h>


int* quicksort(int *feld, int index)
{
  int buffer = 0;
  int pivot = 0;
  int *pointer_kl;
  int *pointer_gr;
  int versatz = 0;

  if (index > 0)
  {
    pivot = feld[index / 2];
    pointer_kl = feld + index;
    pointer_gr = feld;

    do
    {
      while (*pointer_gr <= pivot && pointer_gr != pointer_kl)
      {
        pointer_gr++;
      }

      while (*pointer_kl >= pivot && pointer_kl != pointer_gr)
      {
        pointer_kl--;
      }

      buffer = *pointer_gr;
      *pointer_gr = *pointer_kl;
      *pointer_kl = buffer;

    } while (pointer_gr<pointer_kl);

    versatz = pointer_gr - feld;

    if (versatz >(index / 2) && feld[versatz] > pivot)
    {
      versatz = versatz - 1;
    }

    feld[index / 2] = feld[versatz];
    feld[versatz] = pivot;

    quicksort(feld, (versatz - 1));              //Rekursion
    quicksort(feld + (versatz + 1), index - (versatz + 1));


  }

  else
  {

    return feld;
  }
}

void ausgabe(int *zahlen, int anzahl){
  for (int z = 0; z < anzahl; z++){
    printf("%d\n", zahlen[z]);
  }
}

int main()
{
  int anzahl, auswahl, min, max, index;
  int *zahlen, *fertig;

                  // Bedingungen festlegen
                  printf("Mit diesem Programm können Sie verschiedene 
Sortieralgorithmen verwenden\n\n");
                  printf("Geben Sie die Gr\x94sse des Feldes an:\n");
                  scanf("%d", &anzahl);

                  printf("Geben Sie den Zahlenbereich an:\n");
                  printf("Untere Grenze: ");
  ^dieser teil stimmt^      scanf("%d", &min);
                  printf("Obere Grenze: ");
                  scanf("%d", &max);


                  // Zahlen per Zufall aussuchen
                  zahlen = (int*)malloc((anzahl)* sizeof(int));

                  for (int i = 0; i < anzahl; i++){
                    zahlen[i] = rand() % ((max + 1) - min) + min;
                  }

  //sortieren
    index = anzahl - 1;
    fertig = quicksort(zahlen, index);
    ausgabe(fertig, anzahl);



  system("pause");
  return 0;
}

-------------------------------------------------------------------
Gast #4115813
Lesenswert?
• ▲
▼
Habe den Fehler gefunden !!!!!!!!!!!!!!!!!!!


Dies funktioniert nicht:

fertig = quicksort(zahlen, index);
for (int i = 0; i<anzahl; i++)printf("index:%3d\t\twert:%d\n", i, 
fertig[i]);

 Lösung:

quicksort(zahlen, index);
for (int i = 0; i<anzahl; i++)printf("index:%3d\t\twert:%d\n", i, 
zahlen[i]);


Wäre aber nett, wenn mir jemand erklären könnte, warum nur die untere 
Variante funktioniert

Mfg dulli

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.