partizionamento in 2 porzioni di un array in base ad un valore di discrimine.
codice:
#include <cstdlib>
#include <iostream>
using namespace std;
void partizione_array(int *A, int m, int *p, int y){
/*i indica il massimo indice per i valori <= y; j il minimo indice per i
valori > di y; app rappresenta la variabile temporanea utilizzata per gli scambi*/
int i, j, app;
/*Assegno i valori iniziali ad i e j in modo che la lettura dei valori <= y
parte dall'inizio dell'array; mentre quella dei valori > di y parte dalla fine*/
i=0;
j=m-1;
//Verifico la partizione dell'array
while(i<j){
/*Partendo dall'i-esimo valore incremento i fino a quando A[i]>y oppure
quando i>j*/
while((A[i]<=y) && (i<j))
i=i+1;
/*Partendo dal j-esimo valore decremento j fino a quando A[j]<=y oppure
quando i>j*/
while((A[j]>y) && (i<j))
j=j-1;
/*Se all'uscita del ciclo risulta che il j-esimo valore dell'array sia
maggiore di y, decremento j per uscire dal ciclo*/
if(A[j]>y)
j=j-1;
/*Se i<j eseguo lo scambio tra l'i-esimo valore e il j-esimo valore e
incremento il valore di i e decremento quello di j; in caso contrario
l'array è stato partizionato e non devo eseguire nessuno scambio*/
if(i<j){
app=A[i];
A[i]=A[j];
A[j]=app;
i=i+1;
j=j-1;
}
}
*p=j; //Assegno l'indice di partizionamento
return;
}
int main(){
/*A[80]: array; m: dimensione dell'array; p: indice di partizione;
y: valore di partizione*/
int A[80], m, p, y, i;
//Legge la dimensione dell'array
cout<<"Gli elementi da inserire sono: ";
cin>>m;
cout<<endl;
//Legge i dati dell'array
for(i=0;i<m;i++){
cout<<"Inserire l'elemento numero "<<i<<" : ";
cin>>A[i];
}
cout<<endl;
//Legge il valore di partizione
cout<<"Il valore di partizione y e': ";
cin>>y;
cout<<endl;
partizione_array(A, m, &p, y); //chiamata della procedura
//Stampa l'indice di partizione
cout<<"L'indice di partizione e': "<<p<<endl;
//Stampa l'array partizionato
cout<<"L'array partizionato e': "<<endl;
for(i=0;i<m;i++)
cout<<A[i]<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
credete ci sia qualche errore?