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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren