[알고리즘] 정렬(Sorting)

Jene Hojin Choi·2021년 8월 17일
0

Algorithm

목록 보기
14/17
post-thumbnail

Introduction

정렬 알고리즘은 n개의 숫자가 주어졌을때, 이를 사용자가 지정한 기준에 맞추어 정렬하는 알고리즘이다.


정렬 (Sorting)

선택 정렬 (Selection Sort)

요약

  1. 정렬되지 않은 배열의 맨 앞에서부터, 그 이후의 값중 가장 작은 값을 찾는다.
  2. 가장 작은 값을 찾으면 그 값을 현재 인덱스의 값과 바꾸어준다.
  3. 다음 인덱스로 넘어가고, 위의 과정을 반복한다.

Big-O : O(n^2)

삽입 정렬 (Insertion Sort)

요약

  1. 두번째 인덱스부터 시작한다.
    현재 인덱스의 값은 별도의 변수에 저장하고, 바로 앞 인덱스의 값과 현재 인덱스의 값을 비교한다.
  2. 만약 현재 인덱스의 값이 전 인덱스의 값보다 작다면, 전 인덱스의 값을 현재 인덱스로 옮겨준다.

Big-O

  • 최악의 경우: O(n^2) (Big-O는 최악의 경우를 기준으로 생각. 고로 O(n^2))
  • 이미 정렬된 경우: O(n)

안정 정렬 (Stable sort)이다. 안정 정렬이란, 중복된 값을 입력 순서와 동일하게 정렬하는 정렬 알고리즘이다. 버블 정렬, 병합 정렬 또한 안정 정렬의 종류이다.

버블 정렬 (Bubble Sort)

요약

  1. 매번 연속된 인덱스 두개를 비교한다. 두번째 인덱스부터 시작하여, 바로 앞 인덱스와 비교한다.
  2. 앞 인덱스가 더 크다면, 현재 인덱스와 값을 바꿔준다.
  3. 현재 인덱스가 더 크면, 값을 바꾸지 않고 다음 두 연속된 배열값을 비교한다.

Big-O : O(n^2)

안정 정렬 (Stable sort)이다.

합병 정렬 (Merge Sort)

분할 정복 알고리즘의 하나이다. 분할 정복(divide and conquer) 방법이란,

  • 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략이다.

요약

  1. 현재 열을 반으로 쪼갠다.
  2. 이를 쪼갠 리스트의 크기가 0이나 1이 될때까지 반복한다.
  3. 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다.
  4. 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다.

Big-O: O(nlog_2(n))

안정 정렬 (Stable sort)이다.

퀵 정렬 (Quick Sort)

불안정 정렬이다.
분할 정복 알고리즘의 하나이다.

요약

  1. 리스트 안의 한 요소를 선택한다. (pivot element)
  2. pivot을 중심으로 pivot보다 작은 요소들은 pivot의 왼쪽으로, 큰 요소들은 오른쪽으로 옮긴다.
  • 2개의 인덱스 변수(low, high)를 이용해서 리스트를 두 개의 부분 리스트로 나눈다.
  1. pivot을 제외한 왼쪽 리스트와 오른쪽 리스트를 각각의 pivot을 정하고 이를 기준으로 정렬하는 step 1-2의 과정을 반복한다.
  2. 부분 리스트의 크기가 0이나 1이 될때까지 반복한다.

Big-O: O(nlog_2(n))

힙 정렬 (Heap Sort)

요약

오름차순 정렬을 한다면:
1. 정렬해야하는 요소들로 최대 힙(max heap) 를 구성한다.
2. 가장 큰 요소는 root에 있을 것이다. 루트 노드의 값 대신 힙의 맨 마지막 값을 넣고, 힙의 사이즈를 -1한다. (즉, 최댓값부터 삭제한다.)


Summary

Reference

https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

0개의 댓글