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에서 실행하면, 버퍼 오버런 경고가 발생하였습니다. 또한, 정렬이 되긴 되는데 중간 중간 이상한 값이 섞여들어갑니다. 혹시 제가 어떤 부분을 잘못 작성한건지 알려주실 수 있나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 좋은 기회다 생각하고 디버깅 능력을 키워보세요. 의심가는곳에 브레이크 포인트 설정하고 라인 단위로 트레이스 하면서 변수값을 살펴보세요. 프로그래밍에서 디버깅이 절반이상 시간을 차지해요. 디버깅을 빨리 할 수 있어야 생산성 좋은 개발자가 될 수 있어요. 정영훈 2019.10.13 11:40
  • 이번 기회에 한번 찬찬히 해봐야겠네요.. 좋은 답변 감사드립니다! 알 수 없는 사용자 2019.10.13 11:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)