C言語でアルゴリズムを学んでいる初学者です。
マージソートのアルゴリズムを自分なりに書き換えて理解しようとしているのですが、うまくいきません。
普段ならデバッグをしながら実装の違いを把握できるのですが、再帰が繰り返されるのでデバッグを使って理解するのが難しいです。
どこの部分でうまく書き換えられていないのか、理解出来ず、ご指摘いただけましたら幸いです。
##自分で書き換えたもの
c
1void merge_sort(int A[], int left, int right) 2{ 3 int i, j, k, mid; 4 int work[10]; 5 6 if (left < right) 7 { 8 mid = (left + right) / 2; 9 merge_sort(A, left, mid); 10 merge_sort(A, mid + 1, right); 11 12 for (i = left; i <= mid; i++) 13 work[i] = A[i]; 14 15 for (j = mid + 1; j <= right; j++) 16 work[j] = A[j]; 17 18 i = left; 19 j = mid + 1; 20 for (k = left; k <= right; k++) 21 { 22 if (work[i] < work[j]) 23 A[k] = work[i++]; 24 else 25 A[k] = work[j++]; 26 } 27 } 28}
##参考にしているもの
c
1#include <stdio.h> 2 3void print_array(int array[], int array_len) 4{ 5 for (int i = 0; i < array_len; i++) 6 { 7 printf("%d", array[i]); 8 if (i != array_len - 1) 9 printf(" "); 10 } 11 printf("\n"); 12} 13 14void merge_sort(int A[], int left, int right) 15{ 16 int i, j, k, mid; 17 int work[10]; 18 19 if (left < right) 20 { 21 mid = (left + right) / 2; 22 merge_sort(A, left, mid); 23 merge_sort(A, mid + 1, right); 24 25 for (i = left; i <= mid; i++) 26 work[i] = A[i]; 27 28 for (j = mid + 1; j <= right; j++) 29 work[right - (j - (mid + 1))] = A[j]; 30 31 i = left; 32 j = right; 33 for (k = left; k <= right; k++) 34 { 35 if (work[i] < work[j]) 36 A[k] = work[i++]; 37 else 38 A[k] = work[j--]; 39 } 40 } 41} 42 43int main(void) 44{ 45 int N = 10; 46 int A[10] = {2, 1, 8, 5, 4, 7, 9, 11, 6, 3}; 47 48 merge_sort(A, 0, N - 1); 49 print_array(A, N); 50 51 return 0; 52}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。