Seok_In

[Java] 병합정렬 알고리즘 본문

Java

[Java] 병합정렬 알고리즘

Seok_IN 2022. 9. 12. 17:20

병합정렬은 nlogn의 시간복잡도를 가진다. 1초 기준 100,000의 범위까지 정렬가능

public static void mergeSort(int arr[]){
	sorted[] = new int[arr.length];
    mergeSort(arr, 0, arr.length-1);
    sorted = null;
}

// 왼쪽 오른쪽 나누기
public static void mergeSort(int arr[], int left, int right){
	// 같으면 return
    if(left==right) return;
    int mid = (left+right)/2;
    mergeSort(arr,left,mid);
    mergeSort(arr,mid+1,right);
    merge(arr,left,mid,right);
}

public static void merge(int arr[], int left, int mid, int right){
	int l = left;
    int r = mid+1;
    int idx = left;
    
    // 왼쪽이든 오른쪽이든 범위 내에 있음
    while(l <= mid && r<=right){
    	if(arr[l]<=arr[r]){
        	sorted[idx] = arr[l];
            idx++;
            l++;
        }
        else{
        	sorted[idx] = arr[r];
            idx++;
            r++;
        }
    }
    // 왼쪽을 다 쓰고 오른쪽만 남은경우
    if(l > mid){
    	while(r <= right){
        	sorted[idx] = arr[r];
            idx++;
            r++;
        }
    }
    // 오른쪽을 다 쓰고 왼쪽만 남은경우
    else{
    	while(l<=mid){
        	sorted[idx]=arr[l];
        	idx++;
        	l++;
            }
    }
    
    // 배열을 초기화
    for(int i=left;i<=right;i++){
    	arr[i]=sorted[i];
    }
}

 

'Java' 카테고리의 다른 글

[JAVA] 시간복잡도와 공간복잡도 정리(코테용)  (0) 2022.09.12