c 언어 mergesort algorithm 구현 오류에 대해 질문드립니다(코드 포함).
조회수 445회
사용하는_프로그래밍언어: c language
//여기에 코드를 입력하세요
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define MAX 10000
int* merge(int* array1, int r1, int* array2, int r2)
{
int max = r1 + r2;
int* result = (int*)malloc(sizeof(int) * max);
assert(result != NULL);
int s_result = 0, s_arr1 = 0, s_arr2 = 0;
while (s_arr1 < r1 && s_arr2 < r2)
{
if (array1[s_arr1] > array2[s_arr2])
result[s_result++] = array2[s_arr2++];
else
result[s_result++] = array1[s_arr1++];
}
if(s_arr1 < r1)
memmove(result + s_result, array1 + s_arr1, sizeof(int) * (r1 - s_arr1 - 1));
else
memmove(result + s_result, array2 + s_arr2, sizeof(int) * (r2 - s_arr2 - 1));
free(array1);
free(array2);
return result;
}
int* mergesort(int* array, int n)
{
//already sorted
if (n <= 1)
{
return array;
}
else
{
int cp1_end = n / 2;
int cp2_end = n - cp1_end;
int* cp1 = (int*)malloc(sizeof(int) * cp1_end);
int* cp2 = (int*)malloc(sizeof(int) * cp2_end);
assert(cp1 != NULL && cp2 != NULL);
memmove(cp1, array, sizeof(int) * cp1_end);
memmove(cp2, array + cp1_end, sizeof(int) * cp2_end);
cp1 = mergesort(cp1, cp1_end);
cp2 = mergesort(cp2, cp2_end);
int* result = merge(cp1, cp1_end, cp2, cp2_end);
return result;
}
}
int main(int argc, char* argv[])
{
int n = 10;
int* array = (int*)malloc(sizeof(int) * n);
srand(time(NULL));
assert(array != NULL);
for (int i = 0; i < n; i++)
array[i] = rand() % 500 + 1;
int* sorted_array = mergesort(array, n);
print_array(sorted_array, n);
free(array);
free(sorted_array);
return 0;
}
위의 코드를 visual studio에서 실행하면, 버퍼 오버런 경고가 발생하였습니다. 또한, 정렬이 되긴 되는데 중간 중간 이상한 값이 섞여들어갑니다. 혹시 제가 어떤 부분을 잘못 작성한건지 알려주실 수 있나요?
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력