#include <stdio.h>
#define _Arrlim 0x00001000
int main()
{
int cols=0, _list[_Arrlim];
int _qs3(int *, int, int);
printf("Enter the quantity of elements: ");
scanf("%d",&cols);
if( (cols<=0) || (cols>_Arrlim) )
return 1;
printf("\n");
//get the list of given numbers
{ int u=0, rcols=cols;
while(u<rcols)
{
printf(" element[%5d] = ",u);
scanf("%d",&_list[u]);
u++;
}
}
printf("\n");
_qs3(_list, 0, cols-1);
//Show the list of sorted numbers
{ register int u=0, rcols=cols;
while(u<rcols)
{
printf(" element[%5d] = %10d",u,_list[u]);
u++;
(u%3) ? printf("\t|") : printf("\n") ;
}
}
return 0;
}
int _qs3(int *lst,int fwds,int bwds) // lst means list // fwds means forwards // bwds means backwards
{
if (fwds>=bwds)
return 0;//printf("%d_%d|",fwds,bwds);
int const first=fwds, last=bwds;
void _swap(int *,int *);
int iwfe_fwds, iwfe_bwds; // 'iwfe' means 'is waiting for exchange?'
printf("(l-f)/2= %d\n",(last-first)/2);
//_swap(&lst[(last-first)/2],&lst[last]);
int const pivot = lst[ last ];
printf("pivot =%d\n",pivot);
while (fwds<bwds)
{
iwfe_fwds=(lst[fwds] >= pivot);
iwfe_bwds=(lst[bwds] < pivot);
if ( iwfe_fwds && iwfe_bwds)
{
_swap(&lst[fwds], &lst[bwds]);
fwds++;
bwds--;
}
else
{
if (!iwfe_fwds)
fwds++;
if (!iwfe_bwds)
bwds--;
}
}
if ( lst[fwds] < pivot )
fwds++;
_swap(&lst[fwds],&lst[last]);
_qs3(lst,first,fwds-1);
_qs3(lst,fwds+1,last);
return 0;
}
void _swap(int *a,int *b)
{
int c=*a;
*a=*b;
*b=c;
}
/*
Please Help me I couldn't understand really why it doesn't work. just one line makes everything dysfunctional
Thank you very much for your efforts
*/