티스토리 뷰

선택정렬(Selection Sort)

<예시> 가장 많이 들은 노래 순으로 정렬하기

  1. 노래 리스트 전체 중에서 가장 감상 수가 높은 노래를 하나 뽑아서 새로운 리스트 첫 줄에 작성한다. 이 때 원래의 리스트에서는 그 곡을 삭제한다.
  2. 나머지 리스트 전체 중에서 가장 감상 수가 높은 노래를 뽑아서 새로운 리스트 두번 째줄에 작성한다. 이 역시 원래 리스트에서는 삭제한다.
  3. 이를 계속 반복하면 원래의 리스트가 비워졌을 때에 새로운 리스트에는 감상 수가 높은 순으로 노래가 정렬된다.

이렇게 n개의 노래를 정렬하려면 빅오 표기법으로 O(n^2)만큼의 시간이 걸린다.

첫 번째 실행에서는 n개의 항목을 단순 탐색하므로 O(n)의 시간이 걸린다. 첫 번째 시행 후 원래의 리스트에서 항목이 한 개 지워지므로 다음 탐색은 O(n-1)이 걸린다. 이런 식으로 탐색을 할 때마다 항목이 하나씩 줄어들 것이므로, 한 번 탐색을 할 때의 평균 시간은 O(1/2n)이라고 할 수 있다. 탐색을 n번 수행하므로 전체 걸린 시간은 O(n * 1/2 * n )이 되어야 맞을테지만, 빅오 표기법에서는 1/2과 같은 상수항을 무시한다. 그래서 O(n^2)이 된다.

 

퀵정렬(Quick Sort)

<예시> 숫자로 이루어진 배열을 순서대로 정렬하기

  1. 기본 단계

    정렬할 필요가 없는 배열이 있다.

    qsort([]) // prints []
    qsort([7])  // prints [7]즉
    // 비어있거나 원소가 하나인 배열은 정렬할 필요가 없다.	
    

    또는 정렬이 매우 쉬운 배열이 있다.

    qsort([7,1]) // prints [1,7]
    // 첫 번째 원소가 두 번째 원소보다 크면 교환한다. 아니면 그대로 둔다. 
    

  1. 기준 원소 정하기

    기준원소(pivot)라는 것을 정한다. 일단 임의로 정한다고 가정하자.

    [33, 15, 10] // 기준원소를 33으로 한다.
    

    기준원소를 기준으로 이보다 작은 원소들은 왼쪽에, 이보다 큰 원소들은 오른쪽에 배치한다. 이를 분할(partitioning)이라 한다.

    [15, 10] [33] [] // 기준원소보다 작은 하위배열, 기준원소, 기준원소보다 큰 하위배열
    

    기본단계가 됐으므로 정렬한다.

    qsort([15,10]) + [33] + [] // prints [10,15,33]
    

    이 방법은 기준원소가 어떠한 것이어도 작동한다.

 

  1. 더 큰 배열에 대해 정렬하기

    qsort([3,5,2,1,4]) // 기준원소를 2로 잡는다.
    
    [1] [2] [3,5,4] 
    
    qsort([3,5,4]) // 기준원소를 3으로 잡는다. 
    
    [3] [5,4] 
    
    qsort([5,4]) // 기본 단계. prints [4,5]
    
    qsort([3,5,4]) // prints [3,4,5]
    
    qsort([3,5,2,1,4]) // prints [1,2,3,4,5]
    

     

'Data Structure & Algorithm' 카테고리의 다른 글

너비 우선 탐색(BFS)  (0) 2019.03.30
해시 테이블  (0) 2019.03.29
분할정복  (0) 2019.03.28
JS_Pig Latin  (0) 2019.03.21
JS_Wherefore Art Thou  (0) 2019.03.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함