C - Partizione di un array

di il
3 risposte

C - Partizione di un array

Salve e scusate la mia niubbagine in C, ma lo sto studiando da poco e non riesco a risolvere questo dubbio. Spero in un vostro aiuto.
Quello che non riesco a far partire (non vi preoccupate se l'if di passaggio tra una funzione ed un altra non son sviluppati) è la funzione dell'ultima parte dell'esercizio: la partition_array.
L'esercizio parte in se, ma nella partizione mette sempre il numero più grande nella partizione dei numeri più piccoli del pivot, e non insieme ai numeri più grandi del pivot. Potete farmi capire dove sbaglio? Grazie mille

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

int MAX; /* Dichiarazione variabile della dimensione MAX dell'array */
int arr; /* Dichiarazione variabile dell'array */
int b; /* Dichiarazione di variabile generica */
int y; /* Dichiarazione di variabile per la scelta sulla continuazione dell'esercizio */

int main()
{
    printf("Quanti elementi ha l'array: ");/* Definizione in input del numero MAX di elementi dell'array */
    scanf("%d", &MAX);
    printf("\n");
    int arr[MAX]; /* Dichiarazione dell'array di numero massimo a*/

    for(b=0; b<MAX; b++) /* Ciclo FOR */
    {
        printf("Inserire valore della cella %d:", b); /* Definizione in input dei valori associati agli elementi dell'array */
        scanf("%d", &arr[b]);
    }
    for (b=0; b<MAX; b++) /* Ciclo FOR */
    {
        printf("Il valore della cella %d e' di %d\n", b, arr[b]); /* Stampa a monitor delle celle dell'array con i rispettivi valori a esse associate */
        printf("--------------------------------------\n");
    }
    insertion_sort(arr, MAX); /* Richiamo della funzione insertion */
}

void insertion_sort(int arr[], int MAX)
{

    int att, succ, temp; /* Variabili generiche, att=attuale, succ=successiva, temp=temporanea */

    for(succ=1; succ<MAX; succ++) /* Ciclo FOR */
    {
        att = arr[succ];
        temp= succ - 1;
        while ((temp >=0) && (arr[temp]>att))
        {
            arr[temp+1]=arr[temp];
            temp=temp-1;
        }
        arr[temp+1]=att;
    }

    for(b=0; b<MAX; b++)
    {
        printf("Il valore associato alla cella %d e': %d\n\a", b, arr[b]); /* Stampa a monitor delle celle dell'array con i rispettivi valori a esse associate */
        printf("--------------------------------------\n");

    }
    printf("Se volete continuare con l'inversione dell'array premere 1, altrimenti premere 0:\n\a");
    scanf("%d", &y);

    if (y=1)
    {
        inversion_array(arr, MAX);
    }
}

void inversion_array(int arr[], int MAX)
{

    int h, k; /* Dichiarazioni variabili generiche */
    int arr2[MAX]; /* Dichiarazione di array di supporto */

    h=0;
    k= MAX-1;
    for(h=0; h<MAX; h++)
    {
        arr2[h]=arr[k];
        k--;
    }
    h=0;

    for(h=0; h<MAX; h++)
    {
        arr[h]=arr2[h];
    }
    for(b=0; b<MAX; b++)
    {
        printf(" L'inversione dell'array nella cella %d ha valore: %d\n", b, arr[b]); /* Stampa a monitor delle celle dell'array con i rispettivi valori a esse associate */
    }

    printf("Se volete continuare con la partizione dell'array premere 1, altrimenti premere 0:\n\a");
    scanf("%d", &y);

    if (y==1)
    {
        partition_array(arr, MAX);
    }
}

void partition_array(int arr[], int MAX)
{
    int p; //pivot o discriminante
    int b=1; //variabile che parte dal primo valore
    int f=MAX-1; //Variabile che parte dal MAX-1
    int temp; //Variabile temporanea

    printf("Scegliere quale valore usare da cui eseguire la partizione:\n");
    scanf("%d", &p);

    while((b<f) && (arr[b]<=p))
    {
        b++;
    }
    while((b<f) && (arr[f]>p))
    {
        f--;
    }
    if(arr[f]>p)
    {
        f--;
    }
    while(b<f)
    {
        temp=arr[b];
        arr[b]=arr[f];
        arr[f]=temp;
        b=b+1;
        f=f-1;
        while(arr[b]<=p)
        {
            b=b+1;
        }
        while(arr[f]>p)
        {
            p=p-1;
        }
    }

    printf("La partizione dell'array prima del discriminante %d: \n", p);
    for(int i=0; i < b; i++) //Ciclo FOR per i valori dell'array <= al discriminante
    {
        printf("\nArray [%d] = %d", i, arr[i]);
    }
    printf("\nLa partizione dell'array dopo il discriminante %d: \n", p);
    for(int i = b; i < MAX; i++) //Ciclo FOR per i valori dell'array > al discriminante
    {
        printf("\nArray [%d] = %d", i,arr[i]);
    }
}

3 Risposte

  • Re: C - Partizione di un array

    Son riuscito ad aggiustare il problema che ho riportato sopra (che forse credo di non essermi spiegato bene avendo visto le risposte) cambiando nella voi partition_array la dichiarazione di b=1 in b=0, ma ora mi da un altro problema: dopo aver partizionato l'array col pivot, mi da due array con valori minori e uguali del pivot e valori maggiori del pivot, ma anzichè mettermeli in ordine di grandezza me li mette mischiati. Faccio un esempio:

    array [10]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; imposto che il pivot sia 6, quindi mi darà due array: array1 = {0, 1, 2, 5, 6, 3, 4} e array2= {7, 8, 9}

    Qualcuno mi può vedere dove ci sta qualche altro errore nel codice che ho scritto?
  • Re: C - Partizione di un array

    Ho letto velocemente ma nella partizione perché scambi i valori dell'array?
  • Re: C - Partizione di un array

    Perché se trovo un valore piu grande ma nel lato sbagliato dell'array devo spostarlo nella posizione corretta. Cmq stasera posto il codice corretto perché sono riuscito ad aggiustarlo modificando l'ordine delle funzioni E quindi utilizzando l'array come l'avevo scritto e non l'array modificato dall'insertion_sort.
Devi accedere o registrarti per scrivere nel forum
3 risposte