PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2017/05/21 16:01:02
Name 해피트리
File #1 merge.cpp (2.2 KB), Download : 19
Subject [질문] (C,C++)Merge Sort 성능이 좋지않습니다 무슨 문제일까요?
알고리즘 공부를 하고 있습니다.
Merge Sort를 공부해서 코드를 짜봤는데 성능이 너무 좋지않습니다.
100000 값을 계산하는데 대략 15초 가량 걸리는것 같아요.
[코드에서 컴퓨터에서 계산하는데 추가 로드가 걸리는 부분이 있을까요?]
[코드, test case배열은 첨부했습니다. 아래 붙여넣기는 했지만 가독성이 좋지 않네요.]


능력자님들 조언 부탁드립니다!


**잘못짠건지 결과값도 출력해보고, 루프마다 perf값을 +1해서 전체 몇번이나 루프를 도는지 체크도 해보았습니다.
100000 일때 모든 루프안에서 계산되는 값이 1668928으로 O(100000*log100000) = 1700000 이하로 정상적입니다.
컴퓨터가 1초에 10^9정도 계산하는것으로 알고있는데 10^6 정도면 바로나와야 하는거 아닌가요?
n:10 perf:34
n:14 perf:54
n:53 perf:307
n:256 perf:2048
n:595 perf:5521
n:999 perf:9965
n:1503 perf:15988
n:3951 perf:47267
n:4854 perf:59764
n:6912 perf:88576
n:8801 perf:115631
n:12042 perf:164246
n:25606 perf:376928
n:48140 perf:752844
n:62301 perf:993581
n:89139 perf:1473430
n:100000 perf:1668928
n:100000 perf:1668928
n:100000 perf:1668928
n:100000 perf:1668928



------------------------------------------
#include

#define N 100001 // 배열의 크기
int tmp[N];//병합을 위한 임시배열
int input[N];
long perf;

void ArrayMerge(int start, int end, int* arr)//두 배열의 병합함수
{
int mid = (start + end) / 2;//첫번째 배열의 끝 인덱스
int i = start; //첫번째 배열의 시작 인덱스
int j = mid + 1;//두번째 배열의 시작 인덱스

int k = start; //임시배열의 시작 인덱스
while (i <= mid && j <= end)//두 배열의 끝에 이르기까지 반복
{
perf++;
        if (arr[i] <= arr[j]) //첫번째 배열의 원소가 두번째 배열 원소보다 더 작거나 같으면
{
tmp[k] = arr[i]; //임시배열에 첫번째 배열 원소 추가
i++; //첫번째 배열 현재 인덱스 +1
        }
        else//두번째 배열의 원소가 더 작거나 같으면
{
tmp[k] = arr[j]; //임시배열에 두번째 배열 원소 추가
j++;//두번째 배열 현재 인덱스 +1
        }
        k++; //임시배열의 현재 인덱스 +1
        }

        //두 배열을 비교하고 남은 원소들을 임시배열에 추가
int t; //추가할 원소가 남은 배열의 시작 인덱스
int sch = 0;
        if (i > mid) //첫번째 배열의 원소가 모두 추가되었으면
t = j; //시작 인덱스를 두번째 배열의 현재 인덱스로 설정
else { //두번째 배열의 원소가 모두 추가되었으면
t = i;//시작 인덱스를 첫번째 배열의 현재 인덱스로 설정
sch = 1;
        }
        //남은 원소들을 임시배열에 추가
if (sch == 1) {
        //int numOfLeft = 0;
        for (k; k <= end; k++, t++) {
        perf++;
        tmp[k] = arr[t];
        }
        }
        else {
        for (k; k <= end; k++, t++) {
        perf++;
        tmp[k] = arr[t];
        }
        }

        //임시배열에서 원래 배열로 복사
for (k = 0; k <= end; k++)

        arr[k] = tmp[k];

}

void MergeSort(int start, int end, int*arr)
{
        int mid;
        if (start < end)
        {
        mid = (start + end) / 2; //배열의 중간 인덱스
MergeSort(start, mid, arr);//왼쪽 배열 분할
MergeSort(mid + 1, end, arr);//오른쪽배열 분할
ArrayMerge(start, end, arr);//병합
}
}

int main(void)
{
        int test_case;
        int T;
        int n;
        freopen("input.txt", "r", stdin);

        setbuf(stdout, NULL);
        scanf("%d", &T);

        for (test_case = 1; test_case <= T; ++test_case)
        {
        perf = 0;

        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
        scanf("%d", &input[i]);
        }
MergeSort(0, n - 1, input);
        printf("n:%d perf:%u n", n, perf);
        }
        return 0;
}
-------------------------------------------------------------
[testcase] 올리려고 했는데 너무 길어서 올리기가 힘드네요.
100000 -> 1까지 역순데이터로 정렬해보시면 좋을것 같습니다.




통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
17/05/21 16:31
수정 아이콘
//임시배열에서 원래 배열로 복사
for (k = 0; k <= end; k++)
arr[k] = tmp[k];

마지막에 여기가
for (k = start; k <= end; k++)
arr[k] = tmp[k];
가 되어야해요
해피트리
17/05/21 16:38
수정 아이콘
헐 대박! 감사합니다!
해결했어요!
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
102954 [질문] 이 노래 무슨 노래일까요? 여가수 나오는건데.. [4] 光海2769 17/05/21 2769
102953 [질문] 힙알못입니다. 왜 랩퍼는 모든 걸 다 할 줄 알아야 하나요? [18] 사나없이사나마나5073 17/05/21 5073
102952 [질문] 눈물 날 정도의 명장면이 있는 한국 멜로영화 [31] 사자3184 17/05/21 3184
102950 [질문] 새 공기계 적정가에 구할 방법 있나요? [2] 테네브리움2217 17/05/21 2217
102949 [질문] 울산큰고래 방송 재미있나요? [8] 사쿠라기루카와3631 17/05/21 3631
102948 [질문] 최종면저 발표하는데 걸리는 시간 [6] 마제스티2591 17/05/21 2591
102947 [질문] 저탄고지 다이어트에 대한 의문입니다. [5] 탈로아둔2853 17/05/21 2853
102946 [질문] 사랑니 발치 비용 개당 6만원 적당한가요? [14] Quasar12488 17/05/21 12488
102945 [질문] 학습지 지원하는 기부가 있나요?? [1] kogang20011745 17/05/21 1745
102944 [질문] 네이버 블로그 글을 pc에 어떻게 저장하나요? [2] 민트초코우유3071 17/05/21 3071
102943 [질문] 컴퓨터 업그레이드를 앞두고 있습니다. 파워 교체를 염두에 둬야할까요?? [9] 키토2677 17/05/21 2677
102942 [질문] 영화 겟아웃이나 킹아서 보신분 계신가요? [10] 레너블2608 17/05/21 2608
102941 [질문] 피곤해 보인다, 쩔어보인다 라는 말을 자주 듣습니다. [4] 프리템포3409 17/05/21 3409
102940 [질문] 아침을 간단히 먹는 분들은 어떻게 먹으시나요? [26] 김철(32세,무직)4599 17/05/21 4599
102939 [질문] 자동차 후방카메라 질문드립니다. [1] 40대 되기싫어1798 17/05/21 1798
102938 [질문] (C,C++)Merge Sort 성능이 좋지않습니다 무슨 문제일까요? [2] 해피트리2705 17/05/21 2705
102937 [질문] 노트북 첫 구입예정입니다. 리스트를 뽑아봤는데 저에 맞는것좀 추천해주세요! [3] iloveus2509 17/05/21 2509
102936 [질문] 책 뒷부분을 잘라냈는데 깔끔하게 뒷면을 마감할 방법이 있을까요? [2] 삭제됨2184 17/05/21 2184
102935 [질문] 천안에서 학화호두과자를 구입했습니다. [8] 코메다3188 17/05/21 3188
102933 [질문] 레이지보이 구매처나 구매관련팁을 알고 싶습니다. [2] 민방위면제2144 17/05/21 2144
102932 [질문] 윤미래가 지금 시점에서도 여성래퍼 원탑인가요? [26] 삭제됨5839 17/05/21 5839
102931 [질문] 페이스/바디페인팅 물감 질문드립니다(대구) 동전산거1929 17/05/21 1929
102930 [질문] 전세계약 질문 드리겠습니다. 솔지은1982 17/05/21 1982
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로