asdfsdaaf

Merge Sort

2018. 7. 13. 19:16

#

  특징



*propotion : 비례한

*in-place : 제자리에서


// 꽃댕댕 public class HelloWorld { /************************************ 주의 : arr[]의 크기를 엄청 크게 할 경우 1. stack의 overhead때문에 연산이 수행되지 않을 수 있습니다. 2. String[] args의 크기가 65535byte 밖에 입력되지 않아서 오류를 내뿜습니다. *************************************/ public static void main(String[] args) { int arr[] = { 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, 234, 45 , 563, 345, 345, }; mergeSort(arr); print(arr); } public static void print(int arr[]){ for(int i = 0; i < arr.length; i++){ System.out.print(arr[i] + " "); } } public static void mergeSort(int arrParent[]){ if(arrParent.length < 2) return; int mid = arrParent.length / 2; int arrLeft[] = new int[mid]; int arrRight[] = new int[arrParent.length - mid]; for(int i = 0; i < mid; i++){ arrLeft[i] = arrParent[i]; } for(int i = mid; i < arrParent.length; i++){ arrRight[i-mid] = arrParent[i]; } mergeSort(arrLeft); mergeSort(arrRight); merge(arrLeft, arrRight, arrParent); } public static void merge(int arrLeft[], int arrRight[], int arrParent[]){ int left, right, parent; // i는 left의 인덱스, k는 right의 인덱스 p는 parent=0의 인덱스 left = right = parent = 0; while(left < arrLeft.length && right < arrRight.length){ //2개의 arr중 작은 값을 merge하는데, arrLeft[인덱스]의 값이 작은 경우. if(arrLeft[left] <= arrRight[right]){ arrParent[parent] = arrLeft[left]; left++; } //2개의 arr중 작은 값을 merge하는데, arrRight[인덱스]의 값이 작은 경우. else { arrParent[parent] = arrRight[right]; right++; } parent++; } while( left < arrLeft.length){ arrParent[parent] = arrLeft[left]; parent++; left++; } while( right < arrRight.length){ arrParent[parent] = arrRight[right]; parent++; right++; } } }



'기타' 카테고리의 다른 글

알고리즘용 치팅시트  (0) 2018.12.20
PrepareStatement vs Statement  (0) 2018.08.14
리눅스 명령어  (0) 2018.04.14
JVM 메모리 구조와 연산  (0) 2018.02.20
JK플립플롭의 특성표와 여기표와 상태표의 관계  (0) 2018.02.20

공유하기

facebook twitter kakaoTalk kakaostory naver band