Cでマージソート再帰関数を設定しようとして、次のことを思いつきました。
奇妙な動作は、配列のサイズが小さい場合 (約 10)、完全に正常に動作することです。サイズが 10 から 15 の場合、正しくソートされないことがあります (1 つまたは 2 つの値が最終的な配列にランダムに配置されます)。15 より大きい値の場合、常に 1 つまたは 2 つの値が正しくソートされず、1 つまたは 2 つの整数値が非常に大きな負の整数。
たとえば、この配列:[3] [9] [2] [11] [8] [7] [5] [2]
そのようにソートされます:[2] [2] [3] [-254587859] [7] [8] [11]
--
これが私が思いついたコードです:
主要() :
int main(int ac, char **av)
{
int size = atoi(av[1]);
int *array = malloc(size*sizeof(int));
int i;
for (i = 0; i < size; i++) { array[i] = rand() % size; }
merge_sort(array, 0, size-1);
print_array(array, size);
free(array);
return 0;
}
merge_sort() :
void merge_sort(int array[], int beg, int end)
{
int mid = (end + beg) / 2;
if (beg < end)
{
merge_sort(array, beg, mid);
merge_sort(array, mid+1, end);
merge(array, beg, mid, end);
}
return;
}
マージ():
void merge(int array[], int beg, int mid, int end)
{
int size_left = mid - beg + 1;
int size_right = end - mid;
int *left = malloc((size_left)*sizeof(int));
int *right = malloc((size_right)*sizeof(int));
int i,j,k;
for (i = 0; i < size_left; i++) { left[i] = array[beg+i]; }
for (j = 0; j < size_right; j++) { right[j] = array[mid+1+j]; }
i = 0; j = 0; for (k = beg; k <= end; k++) { array[k] = (left[i] <= right[j]) ? left[i++] : right[j++]; }
free(left); free(right);
return;
}
私はそれがメモリ割り当ての問題だと思います.大量のメモリを割り当てることができました(試してみましたが、うまくいきました)が、それは重要ではありません. そこで何が起こっているか分かりますか?
構成: gcc 4.6.2、Windows 7 64 ビット。