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]);
}
}