[Java] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (1) - ๋ฒ„๋ธ”, ์„ ํƒ, ์‚ฝ์ž…, ์…€, ๋ณ‘ํ•ฉ, ํ€ต ์ •๋ ฌ

2024. 11. 19. 21:04ยท๐Ÿ’ป Language/Java : ์ž๋ฐ”
728x90
728x90

๋ณต์žก๋„

1. ์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ƒํ•œ์„ ์ž…๋ ฅ ํฌ๊ธฐ(n)์— ๋”ฐ๋ผ ํ‘œํ˜„ํ•œ ๊ฒƒ
  • ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•(O)์œผ๋กœ ๋‚˜ํƒ€๋ƒ„
    • O(1) : ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ผ์ •ํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ (์ƒ์ˆ˜ ์‹œ๊ฐ„)
    • O(log n) : ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•ด๋„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์ฒœ์ฒœํžˆ ์ฆ๊ฐ€ (๋กœ๊ทธ ์‹œ๊ฐ„)
    • O(n) : ์ž…๋ ฅ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ (์„ ํ˜• ์‹œ๊ฐ„)
    • O(n^2) : ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ ๋“ฑ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์‹œ๊ฐ„ (์ œ๊ณฑ ์‹œ๊ฐ„)
    • O(2^n) : ์žฌ๊ท€ ํ˜ธ์ถœ ๋“ฑ์ด ๋งŽ์€ ๊ฒฝ์šฐ ๋ฐœ์ƒ (์ง€์ˆ˜ ์‹œ๊ฐ„)

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

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์–‘์„ ์ž…๋ ฅ ํฌ๊ธฐ(n)์— ๋”ฐ๋ผ ํ‘œํ˜„ํ•œ ๊ฒƒ
    • ๊ณ ์ • ๊ณต๊ฐ„ : ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ
    • ๊ฐ€๋ณ€ ๊ณต๊ฐ„ : ์ž…๋ ฅ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ

 


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

์›์†Œ๋“ค์„ ์ผ์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์ฃผ์–ด์ง„ ์ƒํ™ฉ๊ณผ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„ ์ตœ์•… ์‹œ๊ฐ„๋ณต์žก๋„ ๊ณต๊ฐ„๋ณต์žก๋„ ํŠน์ง•
๋ฒ„๋ธ” ์ •๋ ฌ O(n^2) O(n^2) O(1) ๋‹จ์ˆœ, ๋งค์šฐ ๋น„ํšจ์œจ์ 
์„ ํƒ ์ •๋ ฌ O(n^2) O(n^2) O(1) ๋‹จ์ˆœ, ๋น„ํšจ์œจ์ 
์‚ฝ์ž… ์ •๋ ฌ O(n^2) O(n^2) O(1) ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉ
์…€ ์ •๋ ฌ O(n log n) O(n^1.5) O(n^2) ์‚ฝ์ž… ์ •๋ ฌ ๊ฐœ์„ , ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ๋น„ํšจ์œจ์ 
๋ณ‘ํ•ฉ ์ •๋ ฌ O(n log n) O(n log n) O(n) ์•ˆ์ • ์ •๋ ฌ, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์— ์ ํ•ฉ
ํ€ต ์ •๋ ฌ O(n log n) O(n^2) O(log n) ํ‰๊ท ์ ์œผ๋กœ ๋น ๋ฆ„, ๋ถˆ์•ˆ์ • ์ •๋ ฌ
ํž™ ์ •๋ ฌ O(n log n) O(n log n) O(1) ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ํšจ์œจ์ 
๊ณ„์ˆ˜ ์ •๋ ฌ O(n + k) O(N + k) O(n + k) ํŠน์ • ๋ฒ”์œ„์˜ ์ •์ˆ˜ ์ •๋ ฌ์— ์ ํ•ฉ
๊ธฐ์ˆ˜ ์ •๋ ฌ O(n * d) O(n * d) O(n + k) ๋ฒ”์œ„๊ฐ€ ํฐ ์ •์ˆ˜๋‚˜ ๋ฌธ์ž์—ด์— ์ ํ•ฉ
  • ์ •๋ ฌ์—์„œ๋Š” ์›์†Œ์˜ ์ˆœ์„œ๋ฅผ ๋งŽ์ด ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— swap() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
public static void swap(int[] arr, int idx1, int idx2) {
	int tmp = arr[idx1];
    arr[idx1] = arr[idx2];
    arr[idx2] = tmp;
}

 

 

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

  • ์ธ์ ‘ํ•œ ๋‘ ์š”์†Œ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ •๋ ฌ
  • ์‹œ๊ฐ„๋ณต์žก๋„ : ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ O(n), ํ‰๊ท /์ตœ์•… O(n^2)
public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // Swap
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

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

  • ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ ์ •๋ ฌ๋œ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋งจ ์•ž ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ ์ž๋ฆฌ์— ๋“ค์–ด๊ฐˆ ์›์†Œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์‹œ๊ฐ„๋ณต์žก๋„ : ํ‰๊ท /์ตœ์•… O(n^2) ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ O(n)์œผ๋กœ ์ ์–ด ๋ฒ„๋ธ” ์ •๋ ฌ๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ด ์ข‹์Œ
    • ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ ํ•ด๋‹น ์ธ๋ฑ์Šค์™€ swap, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋ฐ˜๋ณต
public class SelectionSort {
    public static void selectionSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            // Swap
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2};
        selectionSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

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

  • ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ถ€๋ถ„์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ธ๋ฑ์Šค 1์˜ ์›์†Œ๋ถ€ํ„ฐ ์•ž ๋ฐฉํ–ฅ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ์•„ ๊ตํ™˜ํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์‹œ๊ฐ„๋ณต์žก๋„ : ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ O(n), ํ‰๊ท /์ตœ์•… O(n^2) ์ •๋ ฌ๋˜์–ด ์žˆ์„ ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ข‹์Œ
    • ์ธ๋ฑ์Šค 1๋ฒˆ๋ถ€ํ„ฐ์˜ ์›์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ž์‹ ์ด ๋“ค์–ด๊ฐˆ ์œ„์น˜์— ๋„ฃ๊ธฐ
public class InsertionSort {
    public static void insertionSort(int[] arr) {
        int n = arr.length;
        for (int i = 1; i < n; 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;
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2};
        insertionSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

4. ์…€ ์ •๋ ฌ (Shell Sort)

  • ์‚ฝ์ž… ์ •๋ ฌ์˜ ๋‹จ์ (n-1๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ผ๋ฉด ๋งŽ์€ swap์ด ํ•„์š”)์€ ๋ณด์™„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ฐฐ์—ด์„ ์ผ์ • ๊ฐ„๊ฒฉ์— ๋”ฐ๋ผ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„์–ด ์ •๋ ฌํ•˜๊ณ , ๋‹ค์‹œ ๊ฐ„๊ฒฉ์„ ์ค„์—ฌ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณต
    • ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด ์‚ฝ์ž… ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ
  • ๊ฐ„๊ฒฉ์€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ 2๋กœ ๋‚˜๋ˆˆ ๊ฐ’์—์„œ ์‹œ์ž‘ํ•ด ๊ฐ„๊ฒฉ์„ 2๋กœ ๋‚˜๋ˆ„๋‹ค ์ตœ์ข…์ ์œผ๋กœ 1์ด ๋˜๋„๋ก ์กฐ์ •ํ•จ
  • ์‹œ๊ฐ„๋ณต์žก๋„ : ๊ฐ„๊ฒฉ ๊ฐ์†Œ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ตœ์„ ์—์„œ O(n log n), ํ‰๊ท  O(n^1.5), ์ตœ์•… O(n^2)
import java.util.Arrays;

public class ShellSort {
    public static void shellSort(int[] arr) {
        int n = arr.length;

        // ์ดˆ๊ธฐ ๊ฐ„๊ฒฉ์€ ๋ฐฐ์—ด ๊ธธ์ด์˜ ์ ˆ๋ฐ˜
        for (int gap = n / 2; gap > 0; gap /= 2) {
            // ๊ฐ„๊ฒฉ๋ณ„ ์‚ฝ์ž… ์ •๋ ฌ ์ˆ˜ํ–‰
            for (int i = gap; i < n; i++) {
                int temp = arr[i];
                int j = i;

                // ๊ฐ„๊ฒฉ(gap) ๋‹จ์œ„๋กœ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌ
                while (j >= gap && arr[j - gap] > temp) {
                    arr[j] = arr[j - gap];
                    j -= gap;
                }
                arr[j] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {9, 8, 3, 7, 5, 6, 4, 1};
        shellSort(arr);
        System.out.println("Sorted array: " + Arrays.toString(arr));
    }
}
๋”๋ณด๊ธฐ

Knuth์˜ ๊ฐ„๊ฒฉ ์ˆ˜์—ด ์‚ฌ์šฉ ๋ฐฉ์‹

  • Knuth ๊ฐ„๊ฒฉ ์ˆ˜์—ด์€ gap = gap * 3 + 1 ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ๋˜๋ฉฐ, ๊ฐ„๊ฒฉ ๊ฐ์†Œ ๋ฐฉ์‹์ด ๋” ์„ธ๋ฐ€ํ•จ
import java.util.Arrays;

public class ShellSortKnuth {
    public static void shellSort(int[] arr) {
        int n = arr.length;

        // Knuth ๊ฐ„๊ฒฉ ์ˆ˜์—ด ์ƒ์„ฑ
        int gap = 1;
        while (gap < n / 3) {
            gap = gap * 3 + 1;
        }

        // ๊ฐ„๊ฒฉ(gap) ๊ฐ์†Œํ•˜๋ฉฐ ์ •๋ ฌ
        while (gap > 0) {
            for (int i = gap; i < n; i++) {
                int temp = arr[i];
                int j = i;

                while (j >= gap && arr[j - gap] > temp) {
                    arr[j] = arr[j - gap];
                    j -= gap;
                }
                arr[j] = temp;
            }
            gap /= 3; // Knuth ์ˆ˜์—ด ๊ฐ์†Œ
        }
    }

    public static void main(String[] args) {
        int[] arr = {9, 8, 3, 7, 5, 6, 4, 1};
        shellSort(arr);
        System.out.println("Sorted array: " + Arrays.toString(arr));
    }
}

 

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

  • ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๋ณ‘ํ•ฉํ•˜๋ฉด์„œ ์ •๋ ฌํ•˜๋Š” ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋กœ ๋ถ„ํ•  → ๋ถ„ํ•  ์™„๋ฃŒ ์‹œ ๋‹ค์‹œ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ํ•ฉ๋ณ‘ํ•˜๊ณ  ์ •๋ ฌ
      → ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ํ•ฉ๋ณ‘๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ•ญ์ƒ O(n log n)์œผ๋กœ ๋น ๋ฅด์ง€๋งŒ, ์ œ์ž๋ฆฌ ์ •๋ ฌ๋ณด๋‹ค O(n)๋งŒํผ์˜ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉ
    • ์šฐ์ธก ๋ถ€๋ถ„๋ฐฐ์—ด์ด ๋‹ค ๋“ค์–ด๊ฐ€๊ณ  ์ขŒ์ธก ๋ถ€๋ถ„๋ฐฐ์—ด๋งŒ ๋‚จ์€ ๊ฒฝ์šฐ : ์ขŒ์ธก ๋ถ€๋ถ„ ๋ฐฐ์—ด๋งŒ ๋„ฃ์œผ๋ฉด ๋จ
    • ์ขŒ์ธก ๋ถ€๋ถ„๋ฐฐ์—ด์ด ๋‹ค ๋“ค์–ด๊ฐ€๊ณ  ์šฐ์ธก ๋ถ€๋ถ„๋ฐฐ์—ด๋งŒ ๋‚จ์€ ๊ฒฝ์šฐ : ์ด๋ฏธ ๋ฐฐ์—ด์ด ๋‹ค ์ •๋ ฌ๋œ ๊ฒƒ
  • System.arraycopy() : for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋น ๋ฆ„
    • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ : OS์™€ ํ•˜๋“œ์›จ์–ด์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ, Java์˜ JNI(Java Native Inferface; ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์™€ Java ์ฝ”๋“œ ๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• )๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋จ. Java๋Š” JVM ์œ„์—์„œ ์‹คํ–‰๋˜์–ด ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ด์ง€๋งŒ arraycopy()์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ•จ์ˆ˜๋Š” ํ”Œ๋žซํผ์— ์ตœ์ ํ™”๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Œ
    • System.arraycopy(์›๋ณธ ๋ฐฐ์—ด, ์›๋ณธ ์‹œ์ž‘ ์ธ๋ฑ์Šค, ๋Œ€์ƒ ๋ฐฐ์—ด, ๋Œ€์ƒ ์‹œ์ž‘ ์ธ๋ฑ์Šค, ์ธ๋ฑ์Šค ๊ฐœ์ˆ˜)
public class MergeSort {
    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[] temp = new int[right - left + 1]; // ์ž„์‹œ ๋ฐฐ์—ด
        int i = left, j = mid + 1, k = 0;

        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }

        while (i <= mid) temp[k++] = arr[i++];
        while (j <= right) temp[k++] = arr[j++];

        System.arraycopy(temp, 0, arr, left, temp.length);
    }

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2};
        mergeSort(arr, 0, arr.length - 1); // ์ •๋ ฌํ•  ๋ฐฐ์—ด, ์‹œ์ž‘๊ณผ ๋ ์ธ๋ฑ์Šค๋ฅผ ๋„˜๊ฒจ์คŒ
        System.out.println(Arrays.toString(arr)); // ๋ฐฐ์—ด ์ถœ๋ ฅ. Arrays.toString ๋ฏธ์‚ฌ์šฉ์‹œ ๋ฐฐ์—ด ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ•ด์‹œ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•จ
    }
}

 

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

  • ํ”ผ๋ฒ—(pivot)์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๋ฉฐ ์ •๋ ฌํ•˜๋Š” ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ผ์ •ํ•œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„ํ• ํ•˜์ง€๋งŒ, ํ€ต ์ •๋ ฌ์€ ํ”ผ๋ฒ—์ด ๋“ค์–ด๊ฐ€๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ๋ถˆ๊ท ํ˜•ํ•˜๊ฒŒ ๋ถ„ํ• ๋จ
    • ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋Š” ์™ผ์ชฝ, ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ์š”์†Œ๋Š” ์˜ค๋ฅธ์ชฝ / ์žฌ๊ท€์ ์œผ๋กœ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ ์ˆ˜ํ–‰
  • ํ•ฉ๋ณ‘ ์ •๋ ฌ๊ณผ ์†๋„๊ฐ€ ๋น„์Šทํ•˜๊ณ  ํž™ ์ •๋ ฌ๋ณด๋‹ค ๋น ๋ฅด์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ(ํ”ผ๋ฒ—์„ ์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ ํƒํ•˜์—ฌ ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ํ•œ์ชฝ์œผ๋กœ ์ ๋ฆฌ๋Š” ๊ฒฝ์šฐ) O(n^2)๋งŒํผ ๊ฑธ๋ฆฌ๊ณ , ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ์ตœ์„ /ํ‰๊ท  O(n log n), ์ตœ์•… O(n^2)
import java.util.Arrays;

public class QuickSort {

    // ํ€ต ์ •๋ ฌ ๋ฉ”์„œ๋“œ
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // ๋ถ„ํ•  ๊ธฐ์ค€ ์ธ๋ฑ์Šค ์ฐพ๊ธฐ
            int pivotIndex = partition(arr, low, high);

            // ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ •๋ ฌ
            quickSort(arr, low, pivotIndex - 1);

            // ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ •๋ ฌ
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    // ๋ถ„ํ•  ๋ฉ”์„œ๋“œ (Lomuto ๋ถ„ํ•  ๋ฐฉ์‹)
    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++;
                swap(arr, i, j);
            }
        }

        // ํ”ผ๋ฒ—์„ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์ด๋™
        swap(arr, i + 1, high);

        return i + 1; // ํ”ผ๋ฒ—์˜ ์ตœ์ข… ์œ„์น˜ ๋ฐ˜ํ™˜
    }

    // ๋ฐฐ์—ด์˜ ๋‘ ์š”์†Œ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    // ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        System.out.println("Original array: " + Arrays.toString(arr));

        quickSort(arr, 0, arr.length - 1);

        System.out.println("Sorted array: " + Arrays.toString(arr));
    }
}

 

728x90
320x100
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ’ป Language > Java : ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] JDK ์„ค์น˜ (Windows 10, JDK 17)  (0) 2025.03.12
[Java] ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ํ’€์–ด๋ณด๊ธฐ - ์ž…์ถœ๋ ฅ๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ  (0) 2024.11.20
[Java] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Java ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜  (0) 2024.11.15
[Java] ์ž๋ฃŒ๊ตฌ์กฐ - ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ, ํž™, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ํ•ด์‹œ  (0) 2024.11.12
[Java] ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์ด๋ž€?  (0) 2023.08.04
'๐Ÿ’ป Language/Java : ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Java] JDK ์„ค์น˜ (Windows 10, JDK 17)
  • [Java] ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ํ’€์–ด๋ณด๊ธฐ - ์ž…์ถœ๋ ฅ๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ
  • [Java] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Java ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜
  • [Java] ์ž๋ฃŒ๊ตฌ์กฐ - ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ, ํž™, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ํ•ด์‹œ
mxnxeonx
mxnxeonx
"์•„, ์ด๊ฑฐ ๋ญ์˜€๋”๋ผ"๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ์œ„ํ•œ ์ผ๊ธฐ์žฅ.
  • mxnxeonx
    MJ's Development Diary
    mxnxeonx
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (154)
      • ๐Ÿ’ป Language (43)
        • Java : ์ž๋ฐ” (18)
        • Python : ํŒŒ์ด์ฌ (9)
        • ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ (9)
        • Android : ์•ˆ๋“œ๋กœ์ด๋“œ (4)
        • JavaScript : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ (2)
      • ๐ŸŒ Environment (19)
        • IDE : ํ†ตํ•ฉ๊ฐœ๋ฐœํ™˜๊ฒฝ (9)
        • Virtual : ๊ฐ€์ƒํ™˜๊ฒฝ (10)
      • โš™ Framework (12)
        • Vue-๋ทฐ (3)
        • Spring-์Šคํ”„๋ง (7)
      • ๐Ÿ’พ DataBase (18)
      • ๐ŸŒŒ OS (36)
        • Linux-๋ฆฌ๋ˆ…์Šค (36)
      • ๐Ÿ’ฌ CI · CD (7)
        • Git : ๊นƒ (7)
      • ๐Ÿ“ƒ ETC (3)
      • ๐Ÿค– AI (4)
  • ๋งํฌ

    • GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
mxnxeonx
[Java] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (1) - ๋ฒ„๋ธ”, ์„ ํƒ, ์‚ฝ์ž…, ์…€, ๋ณ‘ํ•ฉ, ํ€ต ์ •๋ ฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”