Ok grazie di tutto! in effetti ho fatto degli errori abbastanza stupidi, pensavo dipendesse dai puntatori e mi sono concentrato soprattutto su quelli, quando la cosa che era implementata male era il quick stesso, in ogni modo ora sembra che vada.
Il quick sort apparte i problemi segnalati da YuYevon (non pochi ma di distrazione) funziona, ho modificato soltanto sostituito due pezzi ma niente di che:
nella funzione distribuzione:
for(i=sx, j=sx+1; j<dx; j++)
con
for(i=sx, j=sx+1; j<= dx; j++)
e nella funzione QuickSort:
if(A[j] < A[px])
con
if(A[j] <=A[px])
Ho eliminato la funzione "leggi" implementandola nel main, perché mi dava alcuni problemi.
Per quanto riguarda la random(), la utilizzo al posto della rand() per il semplice fatto che all'università (primo anno di informatica) utilizzano random() invece che rand(), non so bene quale sia la differenza ma in fondo fanno la stessa cosa per quanto ho potutto vedere...
Grazie dell'aiuto, comunque il codice ora sembra andare:
codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define RANGE 1000
void scambia(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int distribuzione(int A[], int sx, int px, int dx)
{
int i, j;
if(px != sx)
scambia(&A[sx], &A[px]);
px=sx;
for(i=sx, j=sx+1; j<=dx; j++)
if(A[j]<=A[px])
{
i++;
scambia(&A[i],&A[j]);
}
if(px != i)
scambia(&A[px], &A[i]);
return i;
}
void QuickSort (int A[], int sx, int dx)
{
int perno, pivot;
if(sx<dx)
{
pivot =sx+random()%(dx-sx+1);
perno = distribuzione(A, sx, pivot, dx);
QuickSort (A,sx,perno-1);
QuickSort (A,perno+1,dx);
}
}
void disposizione(int A[], int dim)
{
int i=0, j=dim-1;
while(i != j)
{
if(A[i] % 2 != 0)
{
scambia(&A[i], &A[j]);
j--;
}
else i++;
}
}
int main()
{
int i, cx=0, *A, dim;
srand(time (NULL));
printf("Quanti elmenti deve contenere l'array?\n");
scanf("%d", &dim);
if(dim<=0) return 1;
A = (int*)malloc(sizeof(int)*dim);
if(A==NULL) return 1;
for(i=0; i<dim; i++)
{
*(A+i)= (random()%((RANGE*2)+1)-RANGE);
printf("%d - %d\n", i, A[i]);
}
disposizione(A, dim);
while((A[cx]%2)==0)
cx++;
QuickSort(A, 0, cx-1);
QuickSort(A, cx, dim-1);
printf("Stampa degli elementi ordinati secondo specifiche\n");
for(i=0; i<dim;i++)
printf("%d - %d\n", i, A[i]);
return 0;
}