#define eq(A,B) (!less(A,B)&& !less(B,A)) void quicksort(Item a[],int l,int r) { int i,j,k,p,q; Item v; if (r <=l) return; v=a[r]; i=l-1; j=r; p=l-1; q=r; for(;;) { while (less(a[++i],v)); while (less(v,a[--j])) if (j==l) break; if (i>=j) break; exch(a[i],a[j]); if (eq(a[i],v)) { p++; exch(a[p],a[i]); } if (eq(v,a[j])) { q--; exch(a[q],a[j]); } } exch(a[i],a[r]); j=i-1; i=i+1; for (k=l ; k
q;k--,i++) exch(a[k],a[i]); quicksort(a,l,j); quicksort(a,i,r); }