본문 바로가기

알고리즘

병합정렬

참고 : https://blog.naver.com/rlarjsdn529/222283896613

 

[Java] 합병정렬(Merge Sort) - 자바 / 그림설명 및 소스코드

합병정렬(Merge Sort) 합병정렬이란 정보가 저장되어있는 배열을 계속 쪼개서 길이가 1인 배열로 각각나...

blog.naver.com

import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner in = new Scanner(System.in);
		
		int n = in.nextInt();
		int arr[] = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = in.nextInt();
		}
		
		new Main().solution(n, arr);
		for (int i = 0; i < n; i++) {
			System.out.print(arr[i] + " ");
		}
		
	}
	
	public int[] solution(int n, int[] arr) {
		return mergeSort(arr, 0, n-1);
	}
	
	public int[] mergeSort(int[] arr, int start, int end) {
		if (start < end) {
			int mid = (start+end) / 2;
			mergeSort(arr, start, mid);
			mergeSort(arr, mid+1, end);
			merge(arr, start, mid, end);
		}
		
		return arr;
	}
	
	public void merge(int[] arr, int start, int mid, int end) {
		int[] tmp = new int[arr.length];
		
		int resultIndex = start;
		
		int leftIndex = start;
		int rightIndex = mid+1;
		
		while (leftIndex <= mid && rightIndex <= end) {
			int leftValue = arr[leftIndex];
			int rightValue = arr[rightIndex];
			
			if (leftValue < rightValue) {
				tmp[resultIndex++] = leftValue;
				leftIndex++;
			} else {
				tmp[resultIndex++] = rightValue;
				rightIndex++;
			}
		}
		
		// 남은것 넣어주기
		while (leftIndex <= mid) {
			tmp[resultIndex++] = arr[leftIndex++];
		} 
		while (rightIndex <= end) {
			tmp[resultIndex++] = arr[rightIndex++];;
		}
		
		for (int i = start; i <= end; i++) {
			arr[i] = tmp[i];
		}
	}
}

'알고리즘' 카테고리의 다른 글

이분검색 (이진검색)  (0) 2022.11.18
힙정렬  (0) 2022.11.17
퀵정렬  (0) 2022.11.17
삽입정렬  (0) 2022.11.17
버블정렬  (0) 2022.11.17