クイックソートのアルゴリズム
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort9.html
こちらにあったソースを改造しました。
#include <stdio.h>
void QSort(int x[ ], int left, int right)
{
int i, j, temp;
int pivot;
i = left;
j = right;
pivot = x[(left + right) / 2];
// 6,5,4,3
// pivot=4
while (1) {
while (x[i] <= pivot) i++; // サイトのソースは = が無かったから付けた
// 2回目のループでは j=2
while (pivot < x[j]) j--; // 2回目のループで x[-1] を参照しませんか?
// 初回ループで i=0, j=3
if (i >= j) break;
temp = x[i]; x[i] = x[j]; x[j] = temp; // 交換
i++; j--;
}
ShowData(x, 10); // 途中経過を表示
if (left < i - 1) QSort(x, left, i - 1);
if (j + 1 < right) QSort(x, j + 1, right);
}
void ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++) printf("%d ", x[i]);
printf("\n");
}
void main(void)
{
int x[] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9};
int n = 10;
printf("ソート前:\n");
ShowData(x, n);
printf("ソート中:\n");
QSort(x, 0, n - 1);
printf("ソート後:\n");
ShowData(x, n);
}
テストデータが 6,5,4,3 だと、
2回目のループで x[-1] を参照しませんか?
今コンパイラが使えません。
教えてください。
それと、=を付けたんですが、付けないといけませんよね?
お礼
なるほど、データ数によるのですね。