Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort)
๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ/์ •๋ ฌ

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

2023. 3. 7. 20:12

  ํ•ฉ๋ณ‘์ •๋ ฌ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ๋ณ‘ํ•ฉ์ •๋ ฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

1. ์ •์˜ ๐ŸŽƒ

๋ณ‘ํ•ฉ ์ •๋ ฌ

  ๋ณ‘ํ•ฉ์ •๋ ฌ์ด๋ž€ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฐ์—ด์„ ๊ฐ€์žฅ ์ž‘์„ ๋•Œ๊นŒ์ง€ ๋‚˜๋ˆ„๊ณ , ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ์ธ์ ‘ํ•œ ๋ถ€๋ถ„๋ฐฐ์—ด๋ผ๋ฆฌ ๋น„๊ตํ•˜๋ฉฐ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. (๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)์ด๋ž€ ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ๋ถ„ํ• ํ•œ ๋ฌธ์ œ๋ฅผ ์ •๋ณตํ•˜์—ฌ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด๋‹ค.)

 

2. ๋™์ž‘ ๋ฐฉ์‹ ๐ŸŽช

  1. ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ถ€๋ถ„๋ฐฐ์—ด๋กœ ๋‚˜๋ˆˆ๋‹ค. - ๋ถ„ํ• (Divide)
  2. ํ•ด๋‹น ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ 1๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  3. ์ธ์ ‘ํ•œ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋ผ๋ฆฌ ํ•ฉ์นœ๋‹ค. - ์ •๋ณต(Conquer)

 

  ์œ„์˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ํฌ๊ธฐ๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ถ„ํ• ์ด ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์ ‘ํ•œ ๋ฐฐ์—ด๋ผ๋ฆฌ ํ•ฉ์น˜๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณ‘ํ•ฉํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ •๋ ฌ์ด ๋˜๋Š”์ง€ "๋งˆ์ง€๋ง‰ conquer ๊ณผ์ •์ธ '2 4 6 8'๊ณผ '3 5 7 9'๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ณผ์ •"์„ ํ†ตํ•ด ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

  ํ•ฉ๋ณ‘์„ ์‹œํ‚ฌ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์€ ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ณ‘ํ•ฉ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค๊ณผ ๋น„๊ต๋ฅผ ํ•  ํ•„์š” ์—†์ด ์ธ์ ‘ํ•œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค๋งŒ ๋น„๊ต๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์›์†Œ๋ผ๋ฆฌ ๋น„๊ต๋ฅผ ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์ž‘์€ ๊ฒƒ์ด ๋จผ์ € ๋ฐฐ์น˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  ์˜ˆ์‹œ์—์„œ๋Š” ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์ด ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๊ฐœ์”ฉ ์„ ํƒ์ด ๋˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ผญ ๊ทธ๋Ÿฐ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ž‘์€ ๊ฑฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. '2 8'๊ณผ '4 6'์ด ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๊ตฌํ˜„(JAVA) ๐ŸŽญ

public void main(String[] args) {
    int[] array = {8, 2, 6, 4, 7, 3, 9, 5};

    mergeSort(array, 0, array.length - 1);
}

void mergeSort(int[] array, int left, int right) {
    // ๋” ์ด์ƒ ๋ถ„ํ•  ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 
    // (ํฌ๊ธฐ๊ฐ€ 1์ธ ๊ฒฝ์šฐ) 
    if(left == right) {
        return;
    }

    int mid = (left + right) / 2;

    // ๋ถ„ํ•  (Divide)
    mergeSort(array, left, mid);
    mergeSort(array, mid + 1, right);

    // ๋ถ„ํ• ๋œ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ - ์ •๋ณต(Conquer)
    merge(array, left, mid, right);
}

// ๋ถ„ํ• ๋œ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ
// ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
void merge(int[] array, int left, int mid, int right) {
    // ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
    int[] L = Arrays.copyOfRange(array, left, mid + 1);
    // ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด
    int[] R = Arrays.copyOfRange(array, mid + 1, right + 1);

    // ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ
    int l = 0;
    // ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ
    int r = 0;
    // ๋ณ‘ํ•ฉ๋˜์–ด์ง„ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ
    int idx = left;

    int leftLength = L.length;
    int rightLength = R.length;

    // ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์—์„œ ์›์†Œ๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    // ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด์€ ์ •๋ ฌ๋˜์–ด์ง„ ์ƒํƒœ์ด๋ฏ€๋กœ, ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์˜ ์›์†Œ๋งŒ ๋น„๊ตํ•˜๋ฉด ๋จ 
    while(l < leftLength && r < rightLength) {
        if(L[l] <= R[r]) {
            array[idx] = L[l++];
        }
        else {
            array[idx] = R[r++];
        }
        idx++;
    }

    // ์™ผ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์ด ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ 
    // ๋ณ‘ํ•ฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์งˆ ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
    while(l < leftLength) {
        array[idx++] = L[l++];
    }

    // ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฐฐ์—ด์ด ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ
    // ๋ณ‘ํ•ฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์งˆ ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
    while(r < rightLength) {
        array[idx++] = R[r++];
    }
}

 

4. ์‹œ๊ฐ„๋ณต์žก๋„ & ๊ณต๊ฐ„๋ณต์žก๋„ ๐ŸŽ 

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

  '๋ถ„ํ• 'ํ•  ๋•Œ์™€ '๋ณ‘ํ•ฉ(์ •๋ณต)'ํ•  ๋•Œ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์ƒ๊ฐํ•ด ๋ณด์ž.

[๋ถ„ํ• ]

  ํฌ๊ธฐ๊ฐ€ 1์ธ ๋ฐฐ์—ด๊นŒ์ง€ ๋ถ„ํ• ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํž™์ •๋ ฌ์— ์˜ํ•ด์„œ O(logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

[๋ณ‘ํ•ฉ(์ •๋ณต)]

  i๋ฒˆ์งธ ๋ ˆ๋ฒจ์—๋Š” 2^i๊ฐœ์˜ ๋ถ€๋ถ„๋ฐฐ์—ด์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ถ€๋ถ„๋ฐฐ์—ด์—๋Š” N / 2^i ๊ฐœ์˜ ์›์†Œ๊ฐ€ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ณ‘ํ•ฉ๋œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์›์†Œ ๊ฐœ์ˆ˜๋งŒํผ ๋น„๊ตํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  ๊ทธ๋Ÿฌ๋ฉด i๋ฒˆ์งธ ๋ ˆ๋ฒจ์—์„œ ํ•˜๋‚˜์˜ ๋ณ‘ํ•ฉ๋œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” N / 2^i * 2์˜ ๋น„๊ต๊ฐ€ ์ผ์–ด๋‚˜๊ณ , ์ด 2^i / 2๋ฒˆ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

(N / 2^i * 2) * ( 2^i / 2) = N

  ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ํŠธ๋ฆฌ์˜ ๋†’์ด์ธ logN๋ฒˆ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ O(N logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

  ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N logN)์ด๋‹ค.

  ์ตœ์„ (BEST) ํ‰๊ท (AVERAGE) ์ตœ์•…(WORST)
์‹œ๊ฐ„๋ณต์žก๋„ O(N logN) O(N logN) O(N logN)

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

  ์ •๋ ฌํ•  ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ N์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(2N)์ด๋‹ค.

 

5. ์žฅ์  & ๋‹จ์  ๐Ÿฅ

1. ์žฅ์ 

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N log N)์ด๋‹ค
  • ์•ˆ์ •์ •๋ ฌ์ด๋‹ค.

2. ๋‹จ์ 

  • ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋ณด์กฐ ๋ฐฐ์—ด์—์„œ ์›๋ณธ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ณผ์ •์€ ๋งค์šฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ƒ๋Œ€์ ์œผ๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€ Stranger๋‹˜์˜ ํ•ฉ๋ณ‘์ •๋ ฌ/๋ณ‘ํ•ฉ์ •๋ ฌ(Merge Sort)์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

'๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ > ์ •๋ ฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํž™ ์ •๋ ฌ (Heap Sort)  (0) 2023.03.12
์œ„์ƒ ์ •๋ ฌ(Topology Sort)  (2) 2023.03.07
์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)  (0) 2023.03.06
์„ ํƒ ์ •๋ ฌ(Selection Sort)  (2) 2023.03.04
๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)  (0) 2023.03.04
    '๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ/์ •๋ ฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ํž™ ์ •๋ ฌ (Heap Sort)
    • ์œ„์ƒ ์ •๋ ฌ(Topology Sort)
    • ์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)
    • ์„ ํƒ ์ •๋ ฌ(Selection Sort)
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

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