앞선 포스팅 3개에서 버블정렬, 삽입정렬, 선택정렬에 대해서 알아보았습니다. 하지만 위의 3정렬방법은 굉장히 기초적인 정렬방법으로 시간복잡도는 O(N^2)를가지며 실무에서 잘 쓰이는 정렬방법은 아닙니다. 이번 포스팅부터는 시간복잡도 O(N * LogN)을 가지는 정렬방법에 대해 알아보겠습니다.
먼저 이번포스팅에서는 병합정렬에 대해 알려드리겠습니다. 병합정렬은 정렬할 배열을 반으로 나누어 좌측과 우측 배열을 계속하여 분할해 나간 후 각 배열내에서 정렬 후 병합하는 과정을 통해 정렬하는 알고리즘입니다.
병합정렬(합병정렬)
그림을 통해 설명해드리겠습니다.
①분할과정
먼저 정렬할 숫자들을 원소단위로 분할합니다.
②병합과정
그런 뒤 분할한 원소들을 합치면서 정렬합니다.
병합정렬 소스 코드 (C언어/C++)
#include <stdio.h>
#include <stdlib.h>
void merge(int low, int mid, int high);
void mergeSort(int low, int high);
void printArr(int a[], int n);
void copyArray(int start, int end);
//배열크기
#define number 100000
// 빈 배열 
static int mergeArr1[number];
// 정렬되지 않은 배열 
static int mergeArr2[number];
// 합병정렬함수 
void mergeSort(int low, int high) {
    int mid;
    if(low < high) {
        mid = (low + high)/2;
        mergeSort(low, mid);
        mergeSort(mid+1, high);
        merge(low, mid, high);
	}
}
void merge(int low, int mid, int high) {
    int i = low;
    int j = mid+1;
    int k = low;
    while (i<=mid && j<=high) {
        if(mergeArr2[i] < mergeArr2[j]) {
           mergeArr1[k++] = mergeArr2[i++];
        } else if(mergeArr2[i] >= mergeArr2[j]) {
           mergeArr1[k++] = mergeArr2[j++];
        }
    }
 
    // 남은 영역 조사후 mergedArr으로 복사
    if(i>=mid) {
        while(j<=high) {
           mergeArr1[k++] = mergeArr2[j++];
        }
    }
    if(j>=high) {
        while(i<=mid) {
           mergeArr1[k++] = mergeArr2[i++];
        }
    }
    copyArray(low, high);
}
 
// 배열 출력 함수 
void printArr(int a[], int n) {
     int i;
     for (i=0; i<n; i++) {
        printf("%d ", a[i]);
     }
     printf("\n");
}
 
void copyArray(int start, int end) {
    int i;
    for (i=start; i<=end; i++) {
        mergeArr2[i] = mergeArr1[i];
    }
}
 
int main(int argc, char *argv[]) {
    int i,n;
	 
    printf("몇개의 숫자로 정렬하시겠습니까?\n");
    scanf("%d",&n);
    for(i = 0 ; i < n ; i++)
	mergeArr2[i]=rand()%1000;
  
    printf("정렬전 배열 : ");
    printArr(mergeArr2,n);
    mergeSort(0, n-1);
    printf("정렬후 배열 : ");
    printArr(mergeArr2,n); 
    system("PAUSE");
    return 0;
}
결과
[C언어] 버블정렬 (배열에 있는 정수값 오름차순 정렬하기)
[C언어] 선택정렬 (배열에 있는 정수값 내림차순 정렬하기)
'ETC. > Algorithm' 카테고리의 다른 글
| [Algorithm] 여러가지 정렬 속도 비교(정렬의 시간복잡도) (3) | 2018.05.07 | 
|---|---|
| [Algorithm] 퀵정렬 (빠르고 효율적인 정렬방법) (9) | 2018.05.07 | 
| [Algorithm] 삽입정렬 (배열에 있는 알파벳 차례대로 정렬하기) (0) | 2018.04.27 | 
| [Algorithm] 선택정렬 (배열에 있는 정수값 내림차순 정렬하기) (1) | 2018.04.25 |