Sort

์ •๋ ฌ(Sorting) ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ดํ•˜๋Š” ์ž‘์—…์œผ๋กœ, ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋‚˜ ์‹ค์ œ ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•จ. Java ์—์„œ๋„ ๋‹ค์–‘ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

๊ธฐ๋ณธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๋ฒ„๋ธ”, ์„ ํƒ, ์‚ฝ์ž…) ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํ€ต, ๋ณ‘ํ•ฉ, ํž™) ๊นŒ์ง€ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐœ๋…, ์‹œ๊ฐ„ ๋ณต์žก๋„, Java ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด๋ณด๊ฒ ์Œ.


๊ธฐ๋ณธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)

  • ๊ฐœ๋… : ์ธ์ ‘ํ•œ ๋‘ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ์ž˜๋ชป๋œ ์ˆœ์„œ๋ผ๋ฉด ๊ตํ™˜. ํ•œ ๋ฐ”ํ€ด๋งˆ๋‹ค ๊ฐ€์žฅ ํฐ ์ˆ˜๊ฐ€ ๋’ค๋กœ ์ด๋™ํ•จ.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ :

    • ์ตœ์„  : O(n)O(n)

    • ํ‰๊ท /์ตœ์•… : O(n2)O(n^2)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(1)O(1)

  • ํŠน์ง• : ๋‹จ์ˆœํ•˜๊ณ  ์•ˆ์ • ์ •๋ ฌ์ด์ง€๋งŒ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋–จ์–ด์ง.

public static void bubbleSort(int[] arr) {
    for(int i = 0; i < arr.length - 1; i++) {
        boolean swapped = false;
        for(int j = 0; j < arr.length - i - 1; j++) {
            if(arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

2. ์„ ํƒ ์ •๋ ฌ(Selection Sort)

  • ๊ฐœ๋… : ๋‚จ์€ ๋ถ€๋ถ„ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ณจ๋ผ ์•ž์ชฝ๊ณผ ๊ตํ™˜

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ•ญ์ƒ O(n2)O(n^2)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(1)O(1)

  • ํŠน์ง• : ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ ์ ์ง€๋งŒ ๋ถˆ์•ˆ์ • ์ •๋ ฌ.

public static void selectionSort(int[] arr) {
    for(int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        for(int j = i + 1; j < arr.length; j++) {
            if(arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

3. ์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)

  • ๊ฐœ๋… : ์•ž์—์„œ๋ถ€ํ„ฐ ์ •๋ ฌ๋œ ๋ถ€๋ถ„์— ์ƒˆ ๊ฐ’์„ ์•Œ๋งž์€ ์œ„์น˜์— ์‚ฝ์ž….

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ :

    • ์ตœ์„  : O(n)O(n) (์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ)

    • ํ‰๊ท  / ์ตœ์•… : O(n2)O(n^2)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(1)O(1)

  • ํŠน์ง• : ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ๋น ๋ฆ„. ์•ˆ์ • ์ •๋ ฌ.

public static void insertSort(int[] arr) {
    for(int i = 1; i < arr.length; i++) {
        int key = arr[i];
        int j = i - 1;
        while(j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

๊ณ ๊ธ‰ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

4. ํ€ต ์ •๋ ฌ(Quick Sort)

  • ๊ฐœ๋… : ๊ธฐ์ค€(pivot) ์„ ์ •ํ•ด ์ขŒ์šฐ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ :

    • ํ‰๊ท  : O(nlogn)O(n log n)

    • ์ตœ์•… : O(n2)O(n^2)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(logn)O(log n) (์žฌ๊ท€ ์Šคํƒ)

  • ํŠน์ง• : ๋งค์šฐ ๋น ๋ฅด๋ฉฐ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋จ. ๋ถˆ์•ˆ์ • ์ •๋ ฌ

public static void quickSort(int[] arr, int low, int high) {
    if(low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

private static int partition(int[] arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for(int j = low; j < high; j++) {
        if (arr[j] <= pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
    return i + 1;
}

5. ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort)

  • ๊ฐœ๋… : ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ •๋ ฌ ํ›„ ๋ณ‘ํ•ฉ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ•ญ์ƒ O(nlogn)O(n logn)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)O(n) (์ถ”๊ฐ€ ๋ฐฐ์—ด ํ•„์š”)

  • ํŠน์ง• : ์•ˆ์ • ์ •๋ ฌ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ผ์ •.

public static void mergeSort(int[] arr, int left, int right) {
    if(left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

private static void merge(int[] arr, int left, int mid, int right) {
    int n1 = mid -left + 1;
    int n2 = right - mid;
    int[] L = new int[n1];
    int[] R = new int[n2];
    
    for(int i = 0; i < n1; ++i) L[i] = arr[left - i];
    for(int j = 0; j < n2; ++j) R[j] = arr[mid + 1 + j];
    
    int i = 0, j = 0, k = left;
    while(i < n1 && j < n2) {
        arr[k++] = (L[i] <= R[j]) ? L[i++] : R[j++];
    }
    while (i < n1) arr[k++] = L[i++];
    while (j < n2) arr[k++] = R[j++];
}

6. ํž™ ์ •๋ ฌ(Heap Sort)

  • ๊ฐœ๋… : ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑ ํ›„ ๋ฃจํŠธ์™€ ๊ตํ™˜ํ•˜๋ฉฐ ์ •๋ ฌ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ•ญ์ƒ O(nlogn)O(n log n)

  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(1)O(1)

  • ํŠน์ง• : ๋ถˆ์•ˆ์ • ์ •๋ ฌ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ ๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์•ˆ์ •๋œ ์„ฑ๋Šฅ.

public static void heapSort(int[] arr) {
    int n = arr.length;
    for(int i = n /2 - 1; i >= 0; i--) heapify(arr, n, i);
    for(int i = n - 1; i > 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i , 0);
    }
}

private static void heapify(int[] arr, int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    
    if(left < n && arr[left] > arr[largest]) largest = left;
    if(right < n && arr[right] > arr[largest]) largest = right;
    
    if(largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapigfy(arr, n, largest);
    }
}

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ๋น„๊ตํ‘œ

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ์„ 

ํ‰๊ท 

์ตœ์•…

๊ณต๊ฐ„๋ณต์žก๋„

์•ˆ์ •์„ฑ

๋ฒ„๋ธ” ์ •๋ ฌ

O(n)

O(n^2)

O(n^2)

O(1)

์•ˆ์ •

์„ ํƒ ์ •๋ ฌ

O(n^2)

O(n^2)

O(n^2)

O(1)

๋ถˆ์•ˆ์ •

์‚ฝ์ž… ์ •๋ ฌ

O(n)

O(n^2)

O(n^2)

O(1)

์•ˆ์ •

ํ€ต ์ •๋ ฌ

O(n log n)

O(n log n)

O(n^2)

O(log n)

๋ถˆ์•ˆ์ •

๋ณ‘ํ•ฉ ์ •๋ ฌ

O(n log n)

O(n log n)

O(n log n)

O(n)

์•ˆ์ •

ํž™ ์ •๋ ฌ

O(n log n)

O(n log n)

O(n log n)

O(1)

๋ถˆ์•ˆ์ •

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ ํŒ

  • ์ž…๋ ฅ์ด ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ: ์‚ฝ์ž… ์ •๋ ฌ

  • ์ผ๋ฐ˜์ ์ธ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ: ํ€ต ์ •๋ ฌ

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ๋ณด์žฅ: ๋ณ‘ํ•ฉ ์ •๋ ฌ, ํž™ ์ •๋ ฌ

  • ์•ˆ์ •์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ: ๋ณ‘ํ•ฉ ์ •๋ ฌ

  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ: ํž™ ์ •๋ ฌ

Last updated

Was this helpful?