Mam problem z działaniem quicksorta.

Przy wyświetlaniu posortowanej tablicy rosnąco nie wyswietla mi ostatniego elementu,

a przy sortowaniu malejąco , nie wyświetla pierwszego.


#include <stdio.h>

int read_vector(int vec[], int size, int stop_value)
{
    int val;
    printf("Podaj wartosci\n");
    scanf("%d",&val);
    while(val!=stop_value)
    {
        vec[size]=val;
        
        
        size++;
        
        scanf("%d",&val);
    }
    
    return size;
}
void quicksort_asc(int l, int r, int tab[]);
void quicksort_desc(int l, int r, int tab[]);
void quicksort(int tab[], int size, int dir)
{
    int i;
    int l=0;
    int r=size;
    if(dir==1)
    {quicksort_asc(l, r, tab);
        for(i=0;i<size;i++)
            printf("%d ",tab[i]);
        // display_vector(tab, size+1);
     
    }
    else if(dir==2){quicksort_desc(l, r, tab);
        // display_vector(tab, size);
        for(i=0;i<size;i++)
            printf("%d ",tab[i]);
       //  printf("%d",tab[size]);
      //  printf("%d",size);
    }
        else printf("Error");
}

void quicksort_asc(int l, int r, int tab[])

{
    int temp;
    int i = l;
    int j = r;
    int x = tab[( l + r ) / 2 ];
    do
    {
        while( tab[ i ] < x )
            i++;
        
        while( tab[ j ] > x )
            j--;
        
        if( i <= j )
        {
            temp=tab[i];
            tab[i]=tab[j];
            tab[j]=temp;
            
            i++;
            j--;
        }
    } while( i <= j );
    
    if( l < j ) quicksort_asc(l, j, tab );
    
    if( r > i ) quicksort_asc(i, r, tab );
    
   
}


void quicksort_desc(int l, int r, int tab[])
{
    int temp;
    int i = l;
    int j = r;
    int x = tab[( l + r ) / 2 ];
    do
    {
        while( tab[ i ] > x )
            i++;
        
        while( tab[ j ] < x )
            j--;
        
        if( i <= j )
        {
            temp=tab[i];
            tab[i]=tab[j];
            tab[j]=temp;
            
            i++;
            j--;
        }
    } while( i <= j );
    
    if( l < j ) quicksort_desc(l, j, tab );
        
        if( r > i ) quicksort_desc(i, r, tab );
            
            //display_vector(tab, r+1);
            }
int main() {
    int tab[150];
    int stop_value=0;
    int size=0;
    int dir;
 
    size=read_vector(tab, size,stop_value);
    
    printf("Podaj kierunek\n");
    scanf("%d",&dir);
    quicksort(tab, size, dir);
    return 0;
}