๐ŸŒป JAVA/์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ - ํ€ต ์ •๋ ฌ (Quick-Sort)

iseunghan 2021. 11. 19. 13:45
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•˜๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐธ๊ณ ํ•˜์‹œ๋ ค๋ฉด ํ•ด๋‹น ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์ฃผ์„ธ์š”. ๐Ÿ˜Š

 

'๐ŸŒป JAVA/์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก

๊ณต๋ถ€ํ•œ ๊ฒƒ๋“ค ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

iseunghan.tistory.com

 

Quick Sort

Quick Sort๋Š” real-world ๋ฐ์ดํ„ฐ์—์„œ ๋น ๋ฅด๋‹ค๊ณ  ์•Œ๋ ค์ ธ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

pivot์ด๋ผ๋Š” ๊ฒƒ์„ ์ง€์ •ํ•˜์—ฌ pivot ์™ผ์ชฝ์œผ๋กœ๋Š” pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์„, ์˜ค๋ฅธ์ชฝ์—๋Š” pivot๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•˜๋ฉฐ, ๊ณ„์†ํ•˜์—ฌ ๋ถ„ํ• ํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

Quick Sort๋Š” ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

Merge Sort์™€ ๋‹ฌ๋ฆฌ Quick Sort๋Š” ๋น„๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

 

๋ถˆ์•ˆ์ • ์ •๋ ฌ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N^2)
๊ณต๊ฐ„ ๋ณต์žก๋„ : O(N)

 

๊ณผ์ •

GIF๋กœ ์ดํ•ดํ•˜๋Š” Quick Sort

 

1. ๋จผ์ € ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค ์ค‘ ์ž„์˜๋กœ pivot์„ ์ง€์ •ํ•œ๋‹ค. (๋ณดํ†ต ๊ฐ€์žฅ ์•ž ์›์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค.)

  • ๋จผ์ € ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ถ€ํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค. (์™œ ๋จผ์ € ์ž‘์€ ์ˆ˜ ๋ถ€ํ„ฐ ์ฐพ๋Š”์ง€ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)
  • ์‹œ์ž‘ ์œ„์น˜ + 1 ๋ถ€ํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ์–ธ์ œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š”๊ฐ€? ๋ฐœ๊ฒฌํ•œ ํฐ ์ˆ˜์˜ ์ธ๋ฑ์Šค์™€ ๋ฐœ๊ฒฌํ•œ ์ž‘์€ ์ˆ˜์˜ ์ธ๋ฑ์Šค๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ ธ์„ ๋•Œ๊นŒ์ง€!
    • "์—‡๊ฐˆ๋ ธ๋‹ค." ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ๊ฐ€์š”?
    • ์•„๋ž˜์™€ ๊ฐ™์ด i, j๊ฐ€ ์—‡๊ฐˆ๋ฆฐ ๊ฒฝ์šฐ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์™€ ํ”ผ๋ด‡์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ”ผ๋ด‡์€ ๋” ์ด์ƒ ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
 10  9  8  7  13
(p)          |(i)
          (j)|

 

์ผ๋‹จ ์ด ๊ณผ์ •๋“ค์„ ๋ฌด์ž‘์ • ๋”ฐ๋ผํ•˜๋ฉด์„œ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1-1. ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •

๋งˆ์ง€๋ง‰ ์›์†Œ๋ถ€ํ„ฐ ํ”ผ๋ด‡๊นŒ์ง€ ์‚ดํ”ผ๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

(์ด๋•Œ ํ”ผ๋ด‡๊ณผ ๊ฐ™์€ ์ˆ˜๋ฅผ ์ฐพ๋Š” ์ด์œ ๋Š” ๋ฐ”๋กœ, ์กฐ๊ฑด๋ฌธ ํ•˜๋‚˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.)

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

while( pivot < arr[j])	j--;

// ๋งŒ์•ฝ pivot๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ฐพ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฉ๋‹ˆ๋‹ค.
while( pivot <= arr[j] && j > pivot_idx )	j--;

 

1-2. ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •

ํ”ผ๋ด‡๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์‚ดํ”ผ๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์ค˜์•ผ๊ฒ ์ฃ ?

while( pivot >= arr[i] && i < end)	i++;

 

ํ•˜์ง€๋งŒ ์œ„ ์กฐ๊ฑด์€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ธ๋ฑ์Šค i์™€ j๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆฐ ์ƒํ™ฉ์„ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š”๋ฐ ์œ„ ์กฐ๊ฑด์„ ๊ทธ๊ฒƒ์„ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด i์™€ j๊ฐ€ ์—‡๊ฐˆ๋ ธ๋Š”์ง€ ์ฒดํฌํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

while( i < j && pivot >= arr[i] ) 	i++;

ํ•ด๋‹น ์กฐ๊ฑด์„ ์ฃผ๊ธฐ ์œ„ํ•ด, ๋ฏธ๋ฆฌ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์•„์„œ j์˜ ๊ฐ’์„ ์ฐพ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

2. ๋‘˜์˜ ์ƒํƒœ๋ฅผ ์‚ดํŽด๋ณด์ž

์ง€๊ธˆ์€ i์™€ j๊ฐ€ ์—‡๊ฐˆ๋ฆฌ๊ธฐ ์ง์ „์˜ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— i์™€ j์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด i ์œ„์น˜์— ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ๊ทธ i ์œ„์น˜์—  ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๊ณผ ํ”ผ๋ด‡๊ณผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ๊ตํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

while( i < j ) {
    while( pivot < arr[j] ) j--;
    while( i < j && pivot >= arr[i] ) i++;
    
    swap(i, j);	// ์œ„์น˜ ๊ตํ™˜
}

// i์™€ j๊ฐ€ ์—‡๊ฐˆ๋ ธ์„ ๋•Œ
swap(pivot, i);

๊ฒฐ๊ณผ

ํ”ผ๋ด‡์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์—๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ์ˆ˜, ์˜ค๋ฅธ์ชฝ์€ ํฐ ์ˆ˜๊ฐ€ ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (ํ˜„์žฌ๋Š” ํฐ ์ˆ˜๊ฐ€ ์—†์Œ.)

 

์ด์ œ ํ”ผ๋ด‡ ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋ฐ˜์„ ๋‚˜๋ˆ ์„œ ๋‹ค์‹œ ํ€ต ์ •๋ ฌ์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค!

quick_sort( start_idx, i - 1 );	// ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ
quick_sort( i + 1, end_idx );	// ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ

 

์ „์ฒด ์ฝ”๋“œ

void quick_sort(int start_idx, int end_idx) {
	int pivot = arr[start_idx];
	int i = start_idx;
    int j = end_idx;
    int temp;
    
    while( i < j ) {
    	while( pivot < arr[j] ) j--;
        while( i < j && pivot >= arr[i] ) i++;
        
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    arr[start_idx] = arr[i];
    arr[i] = pivot;
    
    quick_sort(start_idx, i - 1);
    quick_sort(i + 1, end_idx);
}
๋ฐ˜์‘ํ˜•