algorithm class

[Algorithm] 정렬

suhwanc 2019. 10. 17. 16:03

정렬이란?

n개의 서로 다른 수가 주어졌을 떄, 이들을 이동하여 점점 커지게(오름차순), 또는 점점 작아지게(내림차순)으로 만드는 문제이다.

                                   ex)          4 2 1 9 5  ->  1 2 3 5 9

 

이런 식의 문제들은 아주 기본적이지만 실생활에 자주 쓰인다. 수능시험을 본 후 수십 만개의 omr카드를 성적순으로 분류해야하는데 이를 일일히 카운팅하면 정말 피곤할것같다. 머리가 대머리가 되버릴 수도 있다!

이 문제를 풀기 위해선 여러가지 정렬방법을 적용할 수 있다.

대표적인 정렬 방법으로는

 

  • 버블 정렬 (Bubble sort)
  • 삽입 정렬 (Insert sort)
  • 병합 정렬 (Merge sort)
  • 퀵 정렬 (Quick sort)
  • 힙 정렬 (Heap sort)

그 이외에 버킷 정렬, stable sort, 기수 정렬, 계수 정렬 등이 있다.

이 9가지 정렬 방법에 대해 이후 포스팅에서 설명할 예정이다. (그 외엔 이 블로그에 없어요!)

 

이 많은 정렬 방법중에 어떤 것이 가장 효율적일까?? 정렬 알고리즘의 시간복잡도 비교표를 살펴보자.

정렬 방법 가장 좋을 때 평균 최악의 경우
버블 정렬 n^2 n^2 n^2
삽입 정렬 n^2 n^2 n^2
병합 정렬 nlogn nlogn nlogn
퀵 정렬 nlogn nlogn n^2
힙 정렬 nlogn nlogn nlogn

이 표를 보면 육안상으로 가장 빠른 정렬은 병합정렬과 힙정렬이 된다

하지만 보통 내가 코드로 구현하려면 난이도는 대부분 그 반대가 된다! 세상에 공짜는 없음에 유의하자

대체 이 정렬들은 어떤식으로 작동하고, 어떻게 짜야하는걸까??

다음 포스팅에서 버블 정렬과 삽입 정렬에 대해 살펴보자.