こんばんは。>>275のクイックソート修正しました。
mainでの呼び出しが最高に間違っていました(鬱

void qsort( int *array, int first, int last )
{
 int basis, small, big;
 small = first;
 big = last;
 basis = array[ ( first + last ) / 2 ];

 while ( 1 ) {
  for ( ; array[ small ] < basis; ++small ) ;
  for ( ; array[ big ] > basis; --big ) ;
  if ( small >= big ) break;
  swap( array[ small ], array[ big ] );
  ++small;
  --big;
 }
 if ( small - 1 > first ) qsort( array, first, small - 1 );
 if ( big + 1 < last ) qsort( array, big + 1, last );
}

でmainでの呼び出しを下のように修正。
qsort( list, 0, QTY - 1 );

以上でたぶんOKだと思うのですが、いかがでしょうか?

ただ、上のwhile文を下のように書くと上手くソートできないのですが
僕には違いがわかりません。どうぞどなたか理由を教えてください。

while ( small < big ) {
 for ( ; array[ small ] < basis; ++small ) ;
 for ( ; array[ big ] > basis; --big ) ;
 if ( small < big ) {
  swap( array[ small ], array[ big ] );
  ++small;
  --big;
 }
}