๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜

์•Œ๊ณ ๋ฆฌ์ฆ˜ [Algorithm] - ํ€ต ์ •๋ ฌ (4) (C, Python)

ํ€ต ์ •๋ ฌ

์ด๋ฒˆ์—๋Š” ํ€ต ์ •๋ ฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ํ€ต ์ •๋ ฌ์ด๋ž€ ๋Œ€ํ‘œ์ ์ธ '๋ถ„ํ•  ์ •๋ณต'์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ‰๊ท  ์†๋„๊ฐ€ O(N*logN)์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ด์ „์— ๋ฐฐ์› ๋˜ ์„ ํƒ ์ •๋ ฌ, ๋ฒ„๋ธ” ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 10๋งŒ๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋”์šฑ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๊ณ  ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.


๋‹ค์Œ์˜ ์ˆซ์ž๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

1 10 5 8 7 6 4 3 2 9


ํ€ต ์ •๋ ฌ์€ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ๋‘๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์‹์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํŠน์ •ํ•œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•œ ๋’ค์— ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ณด์ž.

ํ€ต ์ •๋ ฌ์—๋Š” ๊ธฐ์ค€ ๊ฐ’์ด ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผ ํ”ผ๋ฒ—(Pivot)์ด๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ๋ณดํ†ต ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ— ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

(3) 7 8 1 5 9 6 10 2 4

๋จผ์ € 3(ํ”ผ๋ฒ—๊ฐ’)๋ณด๋‹ค ํฐ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐพ๊ณ , 3๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค. ์ด๋•Œ 3๋ณด๋‹ค ํฐ์ˆซ์ž๋Š” ๋ฐ”๋กœ 7, 3๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋Š” 2๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ๋‘˜์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค. ๋‹ค์Œ๋„ ๋˜‘๊ฐ™์ด ํฐ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐพ๊ณ , 3๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค. 8๊ณผ 1์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ดํ›„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐพ์€ ํฐ ์ˆซ์ž์™€ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฐพ์€ ์ž‘์€ ์ˆซ์ž๊ฐ€ ์—‡๊ฐˆ๋ฆฐ๋‹ค๋ฉด ํ”ผ๋ฒ— ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 3์„ ๊ธฐ์ค€์œผ๋กœ 3์˜ ์™ผ์ชฝ์—๋Š” 3๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์ด, 3์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” 3๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์ด ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. 3์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๊ณ„์†ํ•ด์„œ ๊ฐ™์€ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค. 

 

#include <stdio.h>

int number = 10;
int data[] = {1, 10, 5, 8 , 7, 6, 4, 3, 2, 9};

void show(){
	int i;
    for(i=0; i<number; i++){
    	printf("%d",data[i]);
        }
}

void quickSort(int* data, int start, int end){
	if (start>=end){ // ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋‘๊ธฐ
    	return;
        }
    
    int key = start; // ํ”ผ๋ฒ—๊ฐ’์€ ์ฒซ๋ฒˆ์งธ ์›์†Œ
    int i = start +1, j=end,temp;
    
    while(i<=j){// ์—‡๊ฐˆ๋ฆด ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต
    	while(i<=end && data[i] <= data[key]){ //ํ”ผ๋ฒ— ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€
        	i++;
        }
        
        while(j>start && data[j] >= data[key]){ // ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
        j--;
        }
        
        if(i>j){  //์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด ํ”ผ๋ฒ— ๊ฐ’๊ณผ ๊ต์ฒด
        temp = data[j];
        data[j] = data[key];
        data[key] = temp;
        }
        
        else{ //์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์€ ์ƒํƒœ๋ฉด i,j๋ฅผ ๊ต์ฒด
        temp = data[j];
        data[j] = data[i];
        data[i] = temp;
        }
    }
    
    quickSort(data,start,j-1);
    quickSort(data,j+1,end);
    
}

int main(void){
	quickSort(data, 0, number-1);
    show();
    return 0;
}

ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ N๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•˜๋˜ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ์ ์—์„œ log N์„ ๊ณฑํ•œ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ํ€ต ์ •๋ ฌ์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N*logN)์ด์ง€๋งŒ, ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด๋‹ค.

 

์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.


๋‹ค์Œ์˜ ์ˆซ์ž๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

1 2 3 4 5 6 7 8 9 10

 


์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ ํ€ต์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์— ๊ฐ€๊น๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „์— ๋‹ค๋ฃฌ ์‚ฝ์ž…์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ์ •๋ ฌํ•  ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋А ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

ํŒŒ์ด์ฌ

def quicksort(data,start,end): #start๋Š” ๋ถ„ํ• ๋œ ์ง‘ํ•ฉ์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’, end๋Š” ๋ถ„ํ• ๋œ ์ง‘ํ•ฉ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’
  if start >= end: #์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ
    return
  
  key = start # ํ”ผ๋ฒ— ๊ฐ’์€ ์ฒซ๋ฒˆ์งธ ์›์†Œ
  i = start +1
  j = end 

  while ( i<= j): #์—‡๊ฐˆ๋ฆด ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ด…
    while i<=end and data[i] <= data[key] : # i๊ฐ€ ์˜ค๋ฅธ์ชฝ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด 
      i+=1
    while(data[j]>= data[key] and j>start): # j๊ฐ€ ์™ผ์ชฝ๋ณด๋‹ค ํฌ๋‹ค๋ฉด
      j -=1

    if i>j: #ํ˜„์žฌ ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด
      temp = data[j]
      data[j] = data[key]
      data[key] = temp
    else:
      temp = data[j]
      data[j] = data[i]
      data[i] = temp
  quicksort(data,start,j-1)
  quicksort(data,j+1,end)


a = [1,10,5,8,7,6,4,3,2,9]
quicksort(a,0,len(a)-1)
a

 


์ด ๊ธ€์€ ๋‚˜๋™๋นˆ๋‹˜์˜ ์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์ขŒ (Algorithm Programming Tutorial)๋ฅผ ์ฐธ๊ณ ํ•ด ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=qQ5iLNjpxSk&list=PLRx0vPvlEmdDHxCvAQS1_6XV4deOwfVrz 

 

 

728x90