#6
by かずま » 8年前
私は次のように修正しました。
コード:
#include <stdio.h> // printf, putchar
#define MAX 4
int a[MAX][MAX] = { // 同じ値(17)があるテストデータ
18, 19, 14, 21,
24, 16, 11, 17,
17, 22, 20, 13,
15, 12, 26, 23,
};
void print(void)
{
for (int i = 0; i < MAX; i++, putchar('\n'))
for (int j = 0; j < MAX; j++) printf(" %3d", a[i][j]);
putchar('\n');
}
void quick(int data[][MAX], int first_x, int first_y, int last_x, int last_y)
{
int i = first_x, j = first_y, k = last_x, l = last_y;
int temp = ((i * MAX + j) + (k * MAX + l)) / 2;
int x = data[temp / MAX][temp % MAX]; // 正しいピボット
for (;;) {
while (data[i][j] < x)
if (++j > MAX - 1) j = 0, i++; // j を増やす --- (1)
while (data[k][l] > x)
if (--l < 0) l = MAX - 1, k--; // l を減らす --- (2)
if (i * MAX + j >= k * MAX + l) break;
temp = data[i][j], data[i][j] = data[k][l], data[k][l] = temp;
if (++j > MAX - 1) j = 0, i++; // j を増やす --- (3)
if (--l < 0) l = MAX - 1, k--; // l を減らす --- (4)
}
if (--j < 0) j = MAX - 1, i--; // j を減らす --- (5)
if (first_x * MAX + first_y < i * MAX + j)
quick(data, first_x, first_y, i, j);
if (++l > MAX - 1) l = 0, k++; // l を増やす --- (6)
if (k * MAX + l < last_x * MAX + last_y)
quick(data, k, l, last_x, last_y);
}
int main(void)
{
print();
quick(a, 0, 0, MAX - 1, MAX - 1);
print();
}
No.1 のプログラムは、(3)と(4)がないので、無限ループになります。
No.5 のプログラムは、(5)がないので、無限ループになります。
私は次のように修正しました。
[code=c]
#include <stdio.h> // printf, putchar
#define MAX 4
int a[MAX][MAX] = { // 同じ値(17)があるテストデータ
18, 19, 14, 21,
24, 16, 11, 17,
17, 22, 20, 13,
15, 12, 26, 23,
};
void print(void)
{
for (int i = 0; i < MAX; i++, putchar('\n'))
for (int j = 0; j < MAX; j++) printf(" %3d", a[i][j]);
putchar('\n');
}
void quick(int data[][MAX], int first_x, int first_y, int last_x, int last_y)
{
int i = first_x, j = first_y, k = last_x, l = last_y;
int temp = ((i * MAX + j) + (k * MAX + l)) / 2;
int x = data[temp / MAX][temp % MAX]; // 正しいピボット
for (;;) {
while (data[i][j] < x)
if (++j > MAX - 1) j = 0, i++; // j を増やす --- (1)
while (data[k][l] > x)
if (--l < 0) l = MAX - 1, k--; // l を減らす --- (2)
if (i * MAX + j >= k * MAX + l) break;
temp = data[i][j], data[i][j] = data[k][l], data[k][l] = temp;
if (++j > MAX - 1) j = 0, i++; // j を増やす --- (3)
if (--l < 0) l = MAX - 1, k--; // l を減らす --- (4)
}
if (--j < 0) j = MAX - 1, i--; // j を減らす --- (5)
if (first_x * MAX + first_y < i * MAX + j)
quick(data, first_x, first_y, i, j);
if (++l > MAX - 1) l = 0, k++; // l を増やす --- (6)
if (k * MAX + l < last_x * MAX + last_y)
quick(data, k, l, last_x, last_y);
}
int main(void)
{
print();
quick(a, 0, 0, MAX - 1, MAX - 1);
print();
}
[/code]
No.1 のプログラムは、(3)と(4)がないので、無限ループになります。
No.5 のプログラムは、(5)がないので、無限ループになります。