こちらのページを参考にして2次元配列のクイックソートをやろうとしたのですが、無限ループ?スタックオーバーフロー?となりうまく動作してくれませんでした。
https://dixq.net/forum/viewtopic.php?t=19289
サンプルコードをそのまま使えば動作したのですが、次元数(?)・配列の形を変更したらこのような状態になってしまいました。
2021.04.02 18:55:17.179 Stack overflow in 'C:\Users\AppData\Roaming\MetaQuotes\Terminal\MQL4\Scripts\2Dim_Quick_Sort.ex4'
自分が何か余計なことをしてしまっているみたいなのです。いろいろ試してみたのですが見当がつきませんでした。原因をご教授いただけないでしょうか?
よろしくお願いいたします。
#define MAX 4 #define MAXb 3 int a[MAX][MAXb] = { // 18, 19, 14, 24, 16, 11, 17, 22, 20, 15, 12, 26, }; //int main(void) { quick(a, 0, 0, MAX - 1, MAXb - 1); print(a); } } void print(int &a[][]) { for (int i = 0; i < MAX; i++) for (int j = 0; j < MAXb; j++) printf(" %3d", a[i][j]); } void quick(int &data[][MAXb], 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 % MAXb]; Print("Pivot : "+temp); for (;;) { while (data[i][j] < x) if (++j > MAXb - 1){ j = 0; i++; } while (data[k][l] > x) if (--l < 0) {l = MAXb - 1; k--; } if (i * MAX + j >= k * MAX + l) break; temp = data[i][j]; data[i][j] = data[k][l]; data[k][l] = temp; if (++j > MAXb - 1) {j = 0; i++; } if (--l < 0) {l = MAXb - 1; k--; } } if (--j < 0) {j = MAXb - 1; i--; } if (first_x * MAX + first_y < i * MAX + j) quick(data, first_x, first_y, i, j); if (++l > MAXb - 1) {l = 0; k++; } if (k * MAX + l < last_x * MAX + last_y) quick(data, k, l, last_x, last_y); } コード
回答2件
あなたの回答
tips
プレビュー