일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- IT
- 기초공부
- 원본과 복사본
- 클로저
- vscode
- 재귀함수
- JavaScript
- css기초
- complexity
- let
- AWS조사
- CSS
- scope
- 생활코딩
- 리커젼
- appendChild
- 코드스테이츠
- AWS
- Big-O notation
- var
- node.js설치
- APPEND
- 메모이제이션
- 스코프
- 인터프리터
- 개발툴
- flex기본
- AWS기초
- prototype
- node.js
- Today
- Total
Jveloper
Sort Algorithm 정리 본문
O(N^2) Sort
- 버블 정렬(Bubble Sort)
시간복잡도는 거의 모든 상황에서 최악의 성능을 보여준다.
만들기 쉽고 직관적일 뿐 되도록이면 쓰지 말아야 할 정렬.
단 예외적으로 이미 정렬된 자료는 1번만 돌면 되기 때문에 최선의 성능을 보여준다.
공간복잡도는 단 하나의 배열에서만 진행하므로 O(N)이다.
- 선택 정렬(Selection Sort)
버블 정렬이 비교하고 바로 바꿔 넣는걸 반복한다면, 선택 정렬은 모든 요소를 훑어서 가장 작은 요소를 골라내는 방식을 n번 반복한다.
버블 정렬과 비슷하지만 보다 개선된 알고리즘이라고 할 수 있다.
어떻게 정렬되어있건 일관성있게 n(n-1)/2에 비례하는 시간이 걸린다는 특징이 있고, 버블 정렬보다 일반적으로 2배정도 빠르다.
공간복잡도는 역시 단 하나의 배열에서만 진행하므로 O(N)이다.
- 삽입 정렬(Insertion Sort)
모든 요소에 대해 앞에서부터 차례대로 이미 정렬된 배열과 비교하여 정렬된 배열 내 자신의 위치를 찾아 삽입함으로서 정렬을 완성.
평균적으로 O(N^2)중에서 빠른편이나 자료구조에 따라선 밀어내는데 오랜 시간이 걸린다.
하지만 이미 정렬되어 있는 자료구조에 자료를 하나씩 삽입/제거하는 경우, 오버헤드가 매우 적기 때문에 이름처럼 최선의 알고리즘이 된다.
O(NlogN) Sort
- 합병 정렬(Merge Sort)
합병 정렬은 퀵 정렬보다 느리고 데이터 크기만한 메모리가 더 필요하므로 공간복잡도도 크다.
하지만 합병 정렬의 최대의 장점은 정렬 시 같은 값이라도 기존 데이터의 순서를 유지한다는 점이다.
이러한 정렬을 Stable Sort 라고도 한다.
- 힙 정렬(Heap Sort)
기본적인 알고리즘은 선택 정렬과 동일하다.
하지만 힙 정렬의 경우 최소값, 최대값을 찾을때 배열을 순회하는게 아니라 만들어둔 힙을 사용하므로,
찾는데엔 O(logN) 그러므로 정렬에는 총 O(NlogN)의 시간복잡도를 갖게된다.
힙 정렬은 추가적인 메모리를 전혀 필요로 하지 않는다. 또한 최악의 경우 O(N^2)의 성능을 내는 퀵 정렬과는 다르게 항상 일정한 성능을 발휘하므로 최소한의 알고리즘만 정의할 경우 힙정렬이 가장 안정적인 성능을 갖는다.
Q1) 힙 정렬이 퀵 정렬보다 좋은 점은?
Q2) 그럼에도 퀵 정렬이 일반적인 경우에 더 빠른 이유는?
- 퀵 정렬(Quick Sort)
평균적인 상황에서 최고의 성능을 나타낸다.
컴퓨터로 가장 많이 구현된 정렬 알고리즘 중 하나이며, 거의 모든 언어에서 제공하는 정렬 함수에서 퀵 정렬 혹은 퀵 정렬의 변형 알고리즘을 사용한다.
방식은 먼저 적절한 원소 하나를 기준(피벗, pivot point)으로 삼아 그보다 작은것을 앞으로 빼내고 그 뒤에 피벗을 옮겨 피벗보다 작은 것, 큰 것으로 나눈다.
합병 정렬과는 다르게 unstable sort 이므로 동일 값을 갖는 원소의 순서가 변할 수 있다.
최악의 경우엔 시간복잡도가 O(N^2)가 되는데 피벗을 최솟값이나 최댓값을 계속해서 잡게되는 경우가 그렇다.
퀵 정렬의 경우 피벗을 어떤 값을 잡느냐에 따라 효율이 천차만별로 달라지므로 피벗고르는것이 가장 중요하다.
Q1) 그렇다면 피벗을 잡는 방법으로는 어떤것들이 있을까?
정렬 알고리즘 시간복잡도 비교
- 구현이 간단하지만 비효율적인 방법
- 삽입 정렬(Insertion Sort), 선택 정렬(Selection Sort), 버블 정렬(Bubble Sort) - 복잡하지만 효율적인 방법
- 퀵 정렬(Quick Sort), 힙 정렬(Heap Sort), 합병 정렬(Merge Sort)
'알고리즘' 카테고리의 다른 글
Tree BFselect(너비 우선 탐색) (0) | 2019.12.31 |
---|---|
Tree DFselect(깊이 우선 탐색) (0) | 2019.12.26 |
힙 정렬(Heap Sort Algorithm) (0) | 2019.12.15 |
선택 정렬(Selection Sort Algorithm) (0) | 2019.12.15 |
삽입 정렬(Insertion Sort Algorithm) (0) | 2019.12.15 |