Quicksort sortiert nicht richtig



  • Hallo, ich habe ein Problem mit Quicksort.
    Ich weiß nicht wie ich es beschreiben soll-> seht selbst

    Input : 5 3 2 6 1 7

    Output: 1 2 3 6 5 7

    hier ist mein code:

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    
    #define inserts 6
    

    partition

    int partition(int* array, int begin, int end){
    
        int x = array[begin]; /*Pivot*/
        int i=begin-1;
        int j=end+1;
        int tmp;
    
       while(1){
    
          while(array[++i]<x && i<=end);
    
          while(array[--j]>x && j>=0);
    
          if(i>=j) break;
    
           if(array[i]>array[j]){
               tmp = array[i];
               array[i] = array[j];
               array[j] = tmp;
           }
         for(; begin < end; begin++)
            printf("%2d", array[begin]);
               printf("\n");     
       }
    
       return i;
    }
    

    quicksort funktion

    void quicksort(int* array, int begin, int end){
    
        int q;
        if(begin<end){
            q = partition(array, begin, end);
            quicksort(array, begin, q-1);
            quicksort(array, q+1, end);
        }
    
    }
    

    main fkt

    int main(void){
    
        int values[inserts] = { 5 , 3 , 2 , 6 , 1 , 7};
        int i;
    
        for(i=0; i<inserts; i++)
            printf("%2d ", values[i]);
        printf("\nZum sortieren Taste druecken!");
    
        if(getchar())
            quicksort(values, 0, inserts);
    
        printf("\n");
    
        for(i=0; i<inserts; i++)
            printf("%2d ", values[i]);
    
        return 0;
    }
    

    danke fürs durchlesen 😉



  • Was liefern denn die Zwischenausgaben in der Partition-Funktion?

    (btw, das Array geht nur von values[0] bis values[5] - aber du sortierst den Wert values[6] noch mit)



  • quicksort(array, begin, q);
            quicksort(array, q+1, end);
    
    return j;
    

    so geht es

    mfg Stelfer



  • korrigierte version falls doch mal jemand auf das gleiche Problem trifft
    cheers

    #include <stdio.h>
    #include <string.h>
    #include <time.h> 
    
    int partition(int* array, int begin, int end)
    {
        int x = array[begin]; /*Pivot*/
        int i=begin-1;
        int j=end+1;
        int tmp;
        while(1)
        {
            while(array[++i]<x && i<=end);
            while(array[--j]>x && j>=0);
            if(i>=j) break;
            if(array[i]>array[j])
            {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
            for(; begin < end; begin++)
            {
                printf("%2d", array[begin]);
            }
            printf("\n");
        }
        return j;
    }
    
    void quicksort(int* array, int begin, int end)
    {
        int q;
        if(begin<end)
        {
            q = partition(array, begin, end);
            quicksort(array, begin, q);
            quicksort(array, q+1, end);
        }
    }
    
    int main(void)
    {
        int inserts=6;
        int values[6] = { 5 , 3 , 2 , 6 , 1 , 7};
        int i;
        for(i=0; i<inserts; i++)
        {
            printf("%2d ", values[i]);
        }
        printf("\nZum sortieren Taste druecken!");
        if(getchar())
        {
            quicksort(values, 0, inserts-1);
        }
        printf("\n");
        for(i=0; i<inserts; i++)
        {
            printf("%2d ", values[i]);
        }
        return 0;
    }
    

Anmelden zum Antworten