c언어(알고리즘)
병합 정렬(Merge-Sort)
Happy_Dobi
2016. 10. 17. 20:19
병합정렬(merge_Sort)
- O(n lng n)의 수행시간이 걸린다.
- 분할 정복기법을 이용해 정렬한다.
1.동작원리
1-1. 처음 주어진 배열을 하나의 원소 단위로 분할 한다.
1-2. 분할된 원소에 대해 서로 쌍을 비교해 정렬 후 병합한다.
2.소스
2-1. mergesort 함수
- /*
- 병합 정렬을 실행하는 함수
- 정렬할 n개의 수열을 n/2개씩 두 개의 부분 수열로 분할하고
- 병합 정렬을 이용해 재귀적으로 그 두 부분 수열을 정렬한다
- 정렬된 두개의 부분 수열을 병합해 하나의 정렬된 수열을 만든다.
- */
- void mergesort(int *arr,int p, int r)
- {
- int q = 0;
- if(p < r)
- {
- q = (p + r) / 2; // 수열을 두개로 나누기 위한 중간 값을 계산
- mergesort(arr,p,q);
- mergesort(arr,q+1,r);
- merge(arr,p,q,r);
- }
- }
2-2. merge 함수
- /*
- 나누어진 원소를 정렬하며 병합하는 함수
- */
- void merge(int *arr, int p, int q, int r)
- {
- int n1 = q - p +1;
- int n2 = r - q;
- int i = 0;
- int j = 0;
- int k = 0;
- for(i = 0; i < n1; i++)
- left[i] = arr[p+i];
- for(j = 0; j < n2; j++)
- right[j] = arr[q+j+1];
- left[n1] = 9999; // 경계값을 설정
- right[n2] = 9999; // 경계값을 설정
- i = 0;
- j = 0;
- // left, right 두 배열의 원소를 앞에서부터 차례대로 비교하며 정렬된 값을 저장한다.
- for(k = p ; k <= r; k++)
- {
- if(left[i] <= right[j])
- {
- arr[k] = left[i];
- i ++;
- }
- else
- {
- arr[k] = right[j];
- j ++;
- }
- }
- }
3. 결과