일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- UTF-8
- CSS
- java
- meta
- beans
- 포인터
- windows
- array
- Kafka
- 악성코드
- query
- 윈도우즈
- c++
- 자료구조
- WebProgramming
- Sort
- Call-by-reference
- API
- jsp
- function
- request
- CLASS
- System
- algorithm
- JavaScript
- 노드
- 투자
- OOP
- HTML
- C
- Today
- Total
hahahia
merge sort(병합 정렬) 본문
/* merge.cpp */
#include <stdio.h>
#define LEN 9
void merge_sort(int num[], int start, int end);
void merge(int num[], int start, int median, int end);
int main()
{
int i;
int arr[LEN] = {10, 67, 63, 17, 23, 78, 12, 73, 86};
merge_sort(arr, 0, LEN-1);
for(i=0; i<LEN; i++)
{
printf("%d\t", arr[i]);
}
}
void merge_sort(int num[], int start, int end) // arr를 두 덩어리의 배열로 나눈다
{
int median = (start + end) / 2; // 중간값 설정
if(start < end)
{
merge_sort(num, start, median); // 각각의 덩어리로 재귀함수(앞)
merge_sort(num, median+1, end); // 각각의 덩어리로 재귀함수(뒤)
merge(num, start, median, end); // 각각의 덩어리를 뭉치면서 정렬
}
}
void merge(int num[], int start, int median, int end)
{
int i, j , k, m, n;
int temparr[LEN]; // 임시 배열
i = start;
j = median+1;
k = start;
while(i<=median && j<=end)
{
temparr[k++] = (num[i] > num[j]) ? num[j++] : num[i++];
// 작은 숫자를 찾아 임시 배열에 넣고 어느쪽 덩어리던 index의 끝에 닿으면 빠져나가도록한다
}
// 아직 배열에 속하지 못한 부분들을 넣기위한 작업
m = (i>median) ? j : i; // // 아직 원소가 남아있는 덩어리가 어디인지 파악
n = (i>median) ? end : median; // for문의 끝 index를 정하는 작업
for(; m<=n; m++) // m,n으로 배열에 속하지 못한 원소를 채워넣는다
temparr[k++] = num[m];
for(m=start; m<=end; m++)
num[m] = temparr[m]; // 임시 배열에서 원래 배열로 데이터 넣기
}
'Algorithm' 카테고리의 다른 글
더블릿 문제풀이(최대 구간 구하기) (0) | 2012.10.04 |
---|---|
쉬프트 연산( << , >> ) (0) | 2012.09.01 |
Selection Sort(선택 정렬) (2) | 2012.04.06 |
insertion sort(삽입정렬) (0) | 2011.06.05 |
유클리드 호제법을 이용한 GCD, LCM 프로그램 (0) | 2011.05.22 |