Inoltre non effettuavi correttamente lo swap degli elementi, ho corretto il codice:

codice:
#include <stdio.h>
#define N 5

int partition(int a[N],int p,int r);
void quicksort(int a[N],int p,int r);

void quicksort(int a[N], int p, int r){
     int q;
     if(p<=r){
             q=partition(a,p,r);
             quicksort(a,p,q-1);
             quicksort(a,q+1,r);
             }
}

int partition(int a[N], int p, int r){  
    int x;
    int i;
    int j;
    x=a[r];
    i=p-1;
    for(j=p; j<r; j++){   // qua era sbagliato ***********
             if(a[j]<=x){
                         i=i+1;
                         int temp=i;
                         a[i]=a[j];
                         a[j]=a[temp];
                         }
                         }
                         int temp1=a[i+1];
                         a[i+1]=a[r];           // anche qua  ************
                         a[r]=temp1;
                         return i+1;
                         }

void stampa(int a[N]){
     int i;
     for(i=0; i<N; i++)
     printf("%d",a[i]);
     }

int main(){
       int a[N];
       int i;
       for(i=0; i<N; i++){
                scanf("%d",&a[i]);
                }
        printf("ok\n\n");
        quicksort(a,1,N-1);
        stampa(a);
        return 0;
}
Tu invece hai scritto :
codice:
int temp1=i+1;
a[i+1]=a[r];
 a[r]=a[temp1];
Ma in temp1 memorizzavi solo l' indice, non il valore di a[i+1], poi in a[i+1] si scrivevi a[r], e il valore originario di a[i+1] andava perso.