λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[μ•Œκ³ λ¦¬μ¦˜] μ•ˆμ •μ μΈ μ •λ ¬ Stable Sorting

좜처

ChatGPT


μ•ˆμ •μ μΈ μ •λ ¬μ΄λž€ μ •λ ¬ 전에 λ™μΌν•œ 값을 가진 μš”μ†Œλ“€μ˜ μƒλŒ€μ μΈ μˆœμ„œκ°€ μ •λ ¬ 후에도 μœ μ§€λ˜λŠ” μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ λ§ν•œλ‹€. 즉, 값이 같은 두 μš”μ†Œκ°€ μžˆμ„ λ•Œ, μ •λ ¬ μ „μ—μ„œμ˜ μˆœμ„œκ°€ μ •λ ¬ 후에도 λ™μΌν•˜λ‹€λ©΄ κ·Έ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ€ μ•ˆμ •μ μ΄λ‹€.

μ˜ˆμ‹œ

병합 μ •λ ¬(Merge Sort), 버블 μ •λ ¬(Bubble Sort), μ‚½μž… μ •λ ¬(Insertion Sort)은 μ•ˆμ •μ μΈ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

λΉ„μ•ˆμ •μ μΈ μ •λ ¬

퀡 μ •λ ¬(Quick Sort), νž™ μ •λ ¬(Heap Sort) 등은 λΉ„μ•ˆμ •μ μΈ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, μ •λ ¬λœ ν›„ λ™μΌν•œ κ°’μ˜ μš”μ†Œλ“€ κ°„μ˜ μˆœμ„œκ°€ λ³€ν•  수 μžˆλ‹€. -> μ •λ ¬ν•˜λ©΄μ„œ 값이 같은 μš”μ†Œλ“€μ˜ μˆœμ„œκ°€ λ°”λ€ŒλŠ” κ²½μš°κ°€ μžˆλŒ€ 

 

μ•ˆμ •μ μΈ μ •λ ¬μ˜ νŠΉμ§•

λ°μ΄ν„°μ˜ μˆœμ„œ μœ μ§€

λ™μΌν•œ 값이 μ—¬λŸ¬ κ°œκ°€ μžˆμ„ λ•Œ, κ·Έ κ°’λ“€ κ°„μ˜ μƒλŒ€μ μΈ μˆœμ„œκ°€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

정렬이 μ€‘μš”ν•œ 경우

μ•ˆμ •μ μΈ 정렬은 λ™μΌν•œ κ°’μ˜ μˆœμ„œκ°€ μ€‘μš”ν•œ 경우, 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°μ˜ νŠΉμ • κΈ°μ€€μœΌλ‘œ 1μ°¨ μ •λ ¬ ν›„, 2μ°¨ 정렬을 μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•˜λ‹€.

 

μ˜ˆμ‹œ : 병합 μ •λ ¬ Merge Sort

병합 정렬은 μ•ˆμ •μ μΈ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, μ •λ ¬λœ 두 ν•˜μœ„ 배열을 병합할 λ•Œ, 같은 값이 μžˆμ„ 경우 μ•žμ— μžˆλŠ” μš”μ†Œλ₯Ό λ¨Όμ € 병합해 μƒλŒ€μ μΈ μˆœμ„œλ₯Ό μœ μ§€ν•œλ‹€.

public class MergeSort {
    public static void mergeSort(int[] arr, int[] temp, int leftStart, int rightEnd) {
        if (leftStart >= rightEnd) {
            return;
        }

        int middle = (leftStart + rightEnd) / 2;
        mergeSort(arr, temp, leftStart, middle);
        mergeSort(arr, temp, middle + 1, rightEnd);
        mergeHalves(arr, temp, leftStart, rightEnd);
    }

    private static void mergeHalves(int[] arr, int[] temp, int leftStart, int rightEnd) {
        int leftEnd = (rightEnd + leftStart) / 2;
        int rightStart = leftEnd + 1;
        int size = rightEnd - leftStart + 1;

        int left = leftStart;
        int right = rightStart;
        int index = leftStart;

        while (left <= leftEnd && right <= rightEnd) {
            if (arr[left] <= arr[right]) {
                temp[index] = arr[left];
                left++;
            } else {
                temp[index] = arr[right];
                right++;
            }
            index++;
        }

        System.arraycopy(arr, left, temp, index, leftEnd - left + 1);
        System.arraycopy(arr, right, temp, index, rightEnd - right + 1);
        System.arraycopy(temp, leftStart, arr, leftStart, size);
    }
}