文字列配列をstrcmp関数を使って、
辞書順にクイックソートするアルゴリズムを作ったのですが、
並び替えた結果を見ると、ところどころ並び替えを間違えています。
原因がまったくわかりません。どのように直せばいいのでしょうか?
line[]が文字列の入っている配列です。

void Swap(int i, int j)   //交換する
{a = line[i];
line[i] = line[j];
line[j] = a; }

void QSort(int left, int right)
{ int i,j,middle;
i = left;    /* ソートする配列の一番小さい要素の添字 */
    j = right;    /* ソートする配列の一番大きい要素の添字 */
  middle = (left + right) / 2;   /* 基準値を配列の中央付近にとる */
while (1) {
   while (strcmp(line[i],line[middle])<0) /* 基準より辞書順に後ろにある文字列が */
i++; /* 出るまで i を増加させる */
while (strcmp(line[j],line[middle])>0) /* 基準より辞書順に前にある文字列が */
j--; /* 出るまで j を減少させる */
if (i >= j) break; /* i >= j なら無限ループから抜ける */
Swap(i, j); /* line[i] と line[j]を交換 */

if ((middle -left) > 0) /* 基準値の左に 2 以上要素があれば */
QSort(left, middle-1); /* 左の配列を クイックソートする */
if ((right - middle)> 0) /* 基準値の右に 2 以上要素があれば */
QSort(middle+1, right); /* 右の配列を クイックソートする */
}