합병 정렬(Merge Sort)




합병 정렬? 

합병 정렬은 병합 정렬이라고도 불리며, 배열을 여러개로 분할해서 병합하면서 정렬하는 방법입니다.


특징

1) 메모리 내부에서 정렬하는 방법

2) 연결 리스트와 같은 순차적인 접근이 가능한 자료구조에 유일한 정렬 방법


어떠한 방법?

예제는 정렬할 배열과 임시로 담아놓을 배열 2개를 이용해서 정렬을 진행했습니다.


아래와 같은 배열이 있을 때



배열을 나눠서 정렬을 한 뒤 병합하면서 정렬을 진행합니다.





배열을 이용한 합병 정렬 예제


배열 출력 함수


void print_array(int array[], int size){
for(int i=0; i<size; i++){
printf("%-4d",array[i]);
}
printf("\n");
}

병합 정렬 함수


- size : 2씩 곱해지면서 정렬할 항의 수를 결정

- first, second : 하나의 배열을 두개처럼 사용하기위한 변수 각각 비교할 항 앞과 뒤를 가리킴

- i, j : 각각 비교할 앞의 항과 뒤의 항

- k : 임시로 담을 배열의 인덱스


void merge_sort(int a[], int n){
int i, j, k;
int first, second, size;
int *b;
b = (int*)malloc(sizeof(int)*n);
for(size = 1; size<n; size *=2){
first = -2 * size; // 초기 값
second = first + size;
while(second + size*2 < n){
first = second + size;
second = first + size;

i = k = first;
j = second;
while(i<first+size || (j<second+size && j<n)){
if(a[i]<=a[j]){
if(i<first + size)
b[k++] = a[i++];
else
b[k++] = a[j++];
}else{
if(j<second+size && j<n)
b[k++] = a[j++];
else
b[k++] = a[i++];
}
printf(" b[%d]=%d\t",k-1,b[k-1]);
}
printf("\n############################\n");
}
for(i=0; i<n; i++)
a[i] = b[i];
}
free(b);
}



메인 함수


void main(){
int array[] = {6,8,5,2,7,3,1,4};
int size = sizeof(array)/sizeof(int);
printf("########### Sorting before ###########\n");
print_array(array, size);
printf("######################################\n");
merge_sort(array, size);
printf("########### Sorting after ###########\n");
print_array(array, size);
}



실행 결과




참고 : C로 배우는 알고리즘 (이재규)

위키백과(합병 정렬)



관련 포스팅


[DataStructure] 기수 정렬(Radix Sort)

[DataStructure] 퀵 정렬(Quick Sort)

[DataStructure] 셸 정렬(Shell Sort)

[DataStructure] 버블 정렬(Bubble Sort)

[DataStructure] 삽입 정렬(Insertion Sort)

[DataStructure] 선택 정렬(Selection Sort)



'언어 > Data Strcuture' 카테고리의 다른 글

[C] 힙 정렬(Heap Sort)  (0) 2019.05.01
[C] 기수 정렬(Radix Sort)  (1) 2019.04.30
[C] 퀵 정렬(Quick Sort)  (0) 2019.04.24
[C] 셸 정렬(Shell Sort)  (2) 2019.04.23
[C] 버블 정렬(Bubble Sort)  (0) 2019.04.20

branch, Merge


안녕하세요 이번에는 git을 이용해서 branch를 생성하고 Merge를 해봤습니다.


1. 테스트 파일 COMMIT & PUSH


test.html이라는 파일을 만들고 커밋을 시도 했습니다.


PS C:\gitTest> git add test.html

PS C:\gitTest> git commit -m "first commit"

 

*** Please tell me who you are.

 

Run

 

  git config --global user.email "you@example.com"

  git config --global user.name "Your Name"

 

to set your account's default identity.

Omit --global to set the identity only in this repository.

 

fatal: unable to auto-detect email address (got '윈도우계정@########(none)')



git을 사용할 이메일과 이름을 설정하라는 메시지가 나왔습니다.


아래와 같이 메일과 이름을 기입해줍니다.


PS C:\gitTest> git config --global user.email "이메일주소@이메일.확장자"

PS C:\gitTest> git config --global user.name "이름기입"



아래와 같이 작성한 파일을 커밋해주고 maser로 Push 해줍니다.



PS C:\gitTest> git commit -m "First Test Commit"

[master (root-commit) 61e65d3] First Test Commit

 1 file changed, 8 insertions(+)

 create mode 100644 test.html


PS C:\gitTest> git push -u origin master

Enumerating objects: 3, done.

Counting objects: 100% (3/3), done.

Delta compression using up to 8 threads

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)

remote:

remote: Create a pull request for 'master' on GitHub by visiting:

remote:      https://github.com/레퍼지토리명/pull/new/masterremote:

To https://github.com/레퍼지토리경로/깃명.git * [new branch]      master -> master

Branch 'master' set up to track remote branch 'master' from 'origin'.



PUSH 명령을 실행해야 실제 레퍼지토리로 파일이 올라가게 됩니다.



2. Branch & Merge


아래와 같은 명령으로 브랜치를 생성 및 교체 할 수 있습니다.


PS C:\gitTest> git branch issue1

PS C:\gitTest> git branch

  issue1

* master

PS C:\gitTest> git checkout issue1

Switched to branch 'issue1'

PS C:\gitTest> git branch

* issue1

  master

PS C:\gitTest> git add test.html

PS C:\gitTest> git -m "테이블 추가"



브랜치를 추가로 만들어서 같은곳을 수정 후 충돌을 내 봤습니다.


PS C:\gitTest> git branch issue3

PS C:\gitTest> git branch

  issue1

  issue3

* master

PS C:\gitTest> git checkout issue3

Switched to branch 'issue3'

PS C:\gitTest> git add test.html

PS C:\gitTest> git commit -m "내용 변경"

[issue3 d421f0d] 내용 변경

 1 file changed, 1 insertion(+), 1 deletion(-)

PS C:\gitTest> git checkout master

Switched to branch 'master'

Your branch is ahead of 'origin/master' by 1 commit.

  (use "git push" to publish your local commits)



충돌이 날 경우 아래와 같은 메시지와 충돌 난 부분을 확인 할 수 있습니다.


PS C:\gitTest> git merge issue3

Auto-merging test.html

CONFLICT (content): Merge conflict in test.html

Automatic merge failed; fix conflicts and then commit the result.



아래와 같은 merge명령을 통해 merge 할 수 있습니다.


PS C:\gitTest> git merge issue3

Updating 6b3412d..d421f0d

Fast-forward

 test.html | 2 +-

 1 file changed, 1 insertion(+), 1 deletion(-)



병합을 마친 후 PUSH를 하게 되면 정상적으로 수정된 파일이 반영됩니다.

PS C:\gitTest> git push

Enumerating objects: 11, done.

Counting objects: 100% (11/11), done.

Delta compression using up to 8 threads

Compressing objects: 100% (6/6), done.

Writing objects: 100% (9/9), 993 bytes | 331.00 KiB/s, done.

Total 9 (delta 1), reused 0 (delta 0)

remote: Resolving deltas: 100% (1/1), done.

To https://github.com/레퍼지토리/깃명.git

   61e65d3..4b29f1c  master -> master




'Configuration management > git' 카테고리의 다른 글

[GIT] Git 설치 및 GitHub 연동  (0) 2018.12.02

+ Recent posts