前提・実現したいこと
C言語のクイックソートのプログラムのトレースを行っています。
そこで、どうしても理解できない疑問が起こりました。
発生している問題・エラーメッセージ
下記の「実行結果」で、(*10)→(*6)、および、(*10)→(*9)にジャンプする箇所があるのですが、なぜそんなことになるのか、いくら考えても分かりません。いろいろprintf()を埋め込んでいって、もうわけが分からなくなってしまいました。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define N 10 5 6void qksort(int d[], int top, int end); 7 8int main(void) 9{ 10 int i; 11 int d[] = {11081, 5137, 24671, 5233, 26229, 12 14891, 25719, 11578, 5160, 4907}; 13 14 printf("【整列前】\n"); 15 for (i = 0; i < N; i++) 16 printf("%d ", d[i]); 17 printf("\n"); 18 19 qksort(d, 0, N - 1); 20 21 printf("【整列後】\n"); 22 for (i = 0; i < N; i++) 23 printf("%d ", d[i]); 24 printf("\n"); 25 return EXIT_SUCCESS; 26} 27 28void qksort(int d[], int top, int end) 29{ 30 int key, wk, i, j; 31 int k; /* デバッグ用 */ 32 33 printf("(*1)\n"); /* デバッグ用 */ 34 key = d[(top+end)/2]; 35 printf("key = %d\n", key); /* デバッグ用 */ 36 i = top - 1; 37 j = end + 1; 38 while (1) { 39 printf("(*2)\n"); /* デバッグ用 */ 40 while (d[++i] < key) 41 ; 42 printf("i = %d\n", i); /* デバッグ用 */ 43 while (d[--j] > key) 44 ; 45 printf("j = %d\n", j); /* デバッグ用 */ 46 if (i >= j) 47 break; 48 wk = d[i]; 49 d[i] = d[j]; 50 d[j] = wk; 51 for (k = 0; k < N; k++) /* デバッグ用 */ 52 printf(" %d", d[k]); /* デバッグ用 */ 53 printf("\n\n"); /* デバッグ用 */ 54 } 55 printf("(*3)\n"); /* デバッグ用 */ 56 printf("top = %d, i-1 = %d\n", top, i-1); /* デバッグ用 */ 57 printf("(*4)\n"); /* デバッグ用 */ 58 if (top < i-1) { 59 printf("(*5)\n"); /* デバッグ用 */ 60 printf("qksort(d, %d, %d);\n", top, i-1); /* デバッグ用 */ 61 qksort(d, top, i - 1); /* 左半分をクイックソート */ 62 } 63 printf("(*6)\n"); /* デバッグ用 */ 64 printf("j+1 = %d, end = %d\n", j+1, end); /* デバッグ用 */ 65 printf("(*7)\n"); /* デバッグ用 */ 66 if (j+1 < end) { 67 printf("(*8)\n"); /* デバッグ用 */ 68 printf("qksort(d, %d, %d);\n", j+1, end); /* デバッグ用 */ 69 qksort(d, j + 1, end); /* 右半分をクイックソート */ 70 } 71 printf("(*9)\n"); /* デバッグ用 */ 72 printf("(*10)\n"); /* デバッグ用 */ 73}
試したこと
すでに上のソースコードに埋め込んでありますが、printf()を使って実行の流れを可視化させました。その実行結果を、下に示します。
(実行結果)
【整列前】 11081 5137 24671 5233 26229 14891 25719 11578 5160 4907 (*1) key = 26229 (*2) i = 4 j = 9 11081 5137 24671 5233 4907 14891 25719 11578 5160 26229 (*2) i = 9 j = 8 (*3) top = 0, i-1 = 8 (*4) (*5) qksort(d, 0, 8); (*1) key = 4907 (*2) i = 0 j = 4 4907 5137 24671 5233 11081 14891 25719 11578 5160 26229 (*2) i = 1 j = 0 (*3) top = 0, i-1 = 0 (*4) (*6) j+1 = 1, end = 8 (*7) (*8) qksort(d, 1, 8); (*1) key = 11081 (*2) i = 2 j = 8 4907 5137 5160 5233 11081 14891 25719 11578 24671 26229 (*2) i = 4 j = 4 (*3) top = 1, i-1 = 3 (*4) (*5) qksort(d, 1, 3); (*1) key = 5160 (*2) i = 2 j = 2 (*3) top = 1, i-1 = 1 (*4) (*6) j+1 = 3, end = 3 (*7) (*9) (*10) (*6) j+1 = 5, end = 8 (*7) (*8) qksort(d, 5, 8); (*1) key = 25719 (*2) i = 6 j = 8 4907 5137 5160 5233 11081 14891 24671 11578 25719 26229 (*2) i = 8 j = 7 (*3) top = 5, i-1 = 7 (*4) (*5) qksort(d, 5, 7); (*1) key = 24671 (*2) i = 6 j = 7 4907 5137 5160 5233 11081 14891 11578 24671 25719 26229 (*2) i = 7 j = 6 (*3) top = 5, i-1 = 6 (*4) (*5) qksort(d, 5, 6); (*1) key = 14891 (*2) i = 5 j = 6 4907 5137 5160 5233 11081 11578 14891 24671 25719 26229 (*2) i = 6 j = 5 (*3) top = 5, i-1 = 5 (*4) (*6) j+1 = 6, end = 6 (*7) (*9) (*10) (*6) j+1 = 7, end = 7 (*7) (*9) (*10) (*6) j+1 = 8, end = 8 (*7) (*9) (*10) (*9) (*10) (*9) (*10) (*6) j+1 = 9, end = 9 (*7) (*9) (*10) 【整列後】 4907 5137 5160 5233 11081 11578 14891 24671 25719 26229
補足情報(FW/ツールのバージョンなど)
OSはWindows10、コンパイラはVisual Studio2012です。
前提・実現したいこと
C言語のクイックソートのプログラムのトレースを行っています。
そこで、どうしても理解できない疑問が起こりました。
発生している問題・エラーメッセージ
下記の「実行結果」で、(*10)→(*6)、および、(*10)→(*9)にジャンプする箇所があるのですが、なぜそんなことになるのか、いくら考えても分かりません。いろいろprintf()を埋め込んでいって、もうわけが分からなくなってしまいました。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define N 10 5 6void qksort(int d[], int top, int end); 7 8int main(void) 9{ 10 int i; 11 int d[] = {11081, 5137, 24671, 5233, 26229, 12 14891, 25719, 11578, 5160, 4907}; 13 14 printf("【整列前】\n"); 15 for (i = 0; i < N; i++) 16 printf("%d ", d[i]); 17 printf("\n"); 18 19 qksort(d, 0, N - 1); 20 21 printf("【整列後】\n"); 22 for (i = 0; i < N; i++) 23 printf("%d ", d[i]); 24 printf("\n"); 25 return EXIT_SUCCESS; 26} 27 28void qksort(int d[], int top, int end) 29{ 30 int key, wk, i, j; 31 int k; /* デバッグ用 */ 32 33 printf("(*1)\n"); /* デバッグ用 */ 34 key = d[(top+end)/2]; 35 printf("key = %d\n", key); /* デバッグ用 */ 36 i = top - 1; 37 j = end + 1; 38 while (1) { 39 printf("(*2)\n"); /* デバッグ用 */ 40 while (d[++i] < key) 41 ; 42 printf("i = %d\n", i); /* デバッグ用 */ 43 while (d[--j] > key) 44 ; 45 printf("j = %d\n", j); /* デバッグ用 */ 46 if (i >= j) 47 break; 48 wk = d[i]; 49 d[i] = d[j]; 50 d[j] = wk; 51 for (k = 0; k < N; k++) /* デバッグ用 */ 52 printf(" %d", d[k]); /* デバッグ用 */ 53 printf("\n\n"); /* デバッグ用 */ 54 } 55 printf("(*3)\n"); /* デバッグ用 */ 56 printf("top = %d, i-1 = %d\n", top, i-1); /* デバッグ用 */ 57 printf("(*4)\n"); /* デバッグ用 */ 58 if (top < i-1) { 59 printf("(*5)\n"); /* デバッグ用 */ 60 printf("qksort(d, %d, %d);\n", top, i-1); /* デバッグ用 */ 61 qksort(d, top, i - 1); /* 左半分をクイックソート */ 62 } 63 printf("(*6)\n"); /* デバッグ用 */ 64 printf("j+1 = %d, end = %d\n", j+1, end); /* デバッグ用 */ 65 printf("(*7)\n"); /* デバッグ用 */ 66 if (j+1 < end) { 67 printf("(*8)\n"); /* デバッグ用 */ 68 printf("qksort(d, %d, %d);\n", j+1, end); /* デバッグ用 */ 69 qksort(d, j + 1, end); /* 右半分をクイックソート */ 70 } 71 printf("(*9)\n"); /* デバッグ用 */ 72 printf("(*10)\n"); /* デバッグ用 */ 73}
試したこと
すでに上のソースコードに埋め込んでありますが、printf()を使って実行の流れを可視化させました。その実行結果を、下に示します。
(実行結果)
【整列前】 11081 5137 24671 5233 26229 14891 25719 11578 5160 4907 (*1) key = 26229 (*2) i = 4 j = 9 11081 5137 24671 5233 4907 14891 25719 11578 5160 26229 (*2) i = 9 j = 8 (*3) top = 0, i-1 = 8 (*4) (*5) qksort(d, 0, 8); (*1) key = 4907 (*2) i = 0 j = 4 4907 5137 24671 5233 11081 14891 25719 11578 5160 26229 (*2) i = 1 j = 0 (*3) top = 0, i-1 = 0 (*4) (*6) j+1 = 1, end = 8 (*7) (*8) qksort(d, 1, 8); (*1) key = 11081 (*2) i = 2 j = 8 4907 5137 5160 5233 11081 14891 25719 11578 24671 26229 (*2) i = 4 j = 4 (*3) top = 1, i-1 = 3 (*4) (*5) qksort(d, 1, 3); (*1) key = 5160 (*2) i = 2 j = 2 (*3) top = 1, i-1 = 1 (*4) (*6) j+1 = 3, end = 3 (*7) (*9) (*10) (*6) j+1 = 5, end = 8 (*7) (*8) qksort(d, 5, 8); (*1) key = 25719 (*2) i = 6 j = 8 4907 5137 5160 5233 11081 14891 24671 11578 25719 26229 (*2) i = 8 j = 7 (*3) top = 5, i-1 = 7 (*4) (*5) qksort(d, 5, 7); (*1) key = 24671 (*2) i = 6 j = 7 4907 5137 5160 5233 11081 14891 11578 24671 25719 26229 (*2) i = 7 j = 6 (*3) top = 5, i-1 = 6 (*4) (*5) qksort(d, 5, 6); (*1) key = 14891 (*2) i = 5 j = 6 4907 5137 5160 5233 11081 11578 14891 24671 25719 26229 (*2) i = 6 j = 5 (*3) top = 5, i-1 = 5 (*4) (*6) j+1 = 6, end = 6 (*7) (*9) (*10) (*6) j+1 = 7, end = 7 (*7) (*9) (*10) (*6) j+1 = 8, end = 8 (*7) (*9) (*10) (*9) (*10) (*9) (*10) (*6) j+1 = 9, end = 9 (*7) (*9) (*10) 【整列後】 4907 5137 5160 5233 11081 11578 14891 24671 25719 26229
補足情報(FW/ツールのバージョンなど)
OSはWindows10、コンパイラはVisual Studio2012です。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/09 16:21