정렬 알고리즘에 대한 것은 개발자 면접에서 자주 나오는 질문 중의 하나!
n개의 숫자를 입력할 때, 사용자가 지정한 기준에 맞게 정렬하여 출력하는 알고리즘
정렬되지 않는 데이터들 中 가장 작은 데이터를 선택하여, 가장 앞부터 순서대로 정렬해나가는 알고리즘
현재 위치에 들어갈 값을 찾아 정렬하는 배열
최소 선택 정렬 (Min-Selection Sort)
최대 선택 정렬 (Max-Selection Sort)
데이터가 小 경우
구현은 쉬우나 처리 속도는 느리기 때문에, 데이터가 많은 경우에는 적합하지 X
정렬되지 않은 인덱스에서 가장 앞에서부터 ~ 이후 배열값 中 가장 작은 값을 찾아간다.
가장 작은 값을 찾았다면, 그 값을 현재 인덱스의 값과 바꾼다.
다음 인덱스에서 위 과정을 반복한다.
n-1개, n-2개, ... 이렇게 1개씩 비교를 반복한다.
전체 비교를 진행하므로, 시간 복잡도는 O(N²)
Worst, Average, Best 모두 동일
데이터가 小 경우
or 일부가 정렬된 경우
실행 속도가 느리기 때문에, 데이터가 많은 경우에는 적합하지 X
그러나, 일부의 데이터들이 어느 정도 정렬(오름차순/내림차순)되어 있는 경우라면, 빠른 처리를 기대할 수는 있다.
두 번째 인덱스부터 시작한다.
현재 인덱스
는 별도의 변수에 저장하고, 비교 인덱스
를 현재 인덱스의 -1로 잡는다.
별도로 저장해둔 삽입을 위한 변수 vs 비교 인덱스의 배열 값을 비교
삽입 변수 < 비교 인덱스의 배열 값 일 경우,
현재 인덱스로 비교 인덱스의 값을 저장하고, 비교 인덱스를 -1해서 비교를 반복
삽입 변수 > 비교 인덱스의 배열 값 일 경우,
비교 인덱스 +1 에 삽입 변수를 저장
시간복잡도는 O(N²)
Worst, Average는 동일
이미 정렬되어 있는 Best의 경우 O(N)
인접한 데이터를 교환 처리해서, 최종적으로는 모든 데이터들을 오름차순/내림차순 정렬하는 알고리즘
매번 연속된 두 개 인덱스를 비교해서, 정한 기준의 값을 뒤로 넘겨서 정렬
데이터가 小 경우
이해는 쉬우나 처리 속도는 느리기 때문에, 데이터가 많은 경우에는 적합하지 X
두 번째 인덱스부터 시작한다.
현재 인덱스 값 vs 바로 이전의 인덱스 값 비교
현재 인덱스 값 < 바로 이전의 인덱스 값 일 경우,
두 위치를 변경
현재 인덱스 값 > 바로 이전의 인덱스 값
변경하지 않고, 다음 두 연속된 배열값들을 비교
이 과정을 '전체 배열의 크기 - 현재까지 순홚나 바퀴 수' 만큼 반복
시간 복잡도는 O(N²)
Worst, Average, Best 모두 동일
전체 배열을 반으로 나눈다.
두 배열 A, B 의 크기를 비교
i 에는 A 배열의 시작 인덱스를 저장
j 에는 B 배열의 시작 주소를 저장
A[i] vs B[j] 비교
이 과정을 i 또는 j 中 하나가 각자 배열의 끝에 도달할 때까지 반복
끝까지 저장하지 못한 배열의 값의 경우, 순서대로 모두 C 배열에 저장
C 배열을 원래 배열에 저장
시간 복잡도는 O(N ㏒ N)
Worst, Average, Best 모두 동일
분할 정복 (Divide and conquer) 방식으로 설계된 알고리즘
사용 빈도가 가장 多 알고리즘 유형
데이터가 多 경우
처리 속도가 가장 빠른 알고리즘이기 때문 ("퀵" 정렬)
pivot point 로 설정할 배열의 값 하나를 정한다.
left 변수와 right 변수를 생성
right 변수부터 비교를 진행
left 변수 비교를 진행
left 인덱스 값과 right 인덱스 값을 바꾼다.
left < right 일 떄까지 위 과정을 반복
위 과정이 끝나면, left 값과 pivot point 를 바꾼다.
가장 왼쪽부터 ~ left-1까지, left+1부터 ~ 가장 오른쪽까지 로 나눠서 퀵 정렬을 반복
시간 복잡도는 O(N ㏒ N)
Average, Best는 동일
Worst의 경우 O(N²)
이진트리 기반의 트리형 자료구조
최솟값 or 최댓값을 찾아내기 위해 사용
내림차순 정렬을 위해서는 최대 힙을 구성
오름차순 정렬을 위해서는 최소 힙을 구성
시간 복잡도는 O(N ㏒ N)
Worst, Average, Best 모두 동일
기수 정렬은 낮은 자릿수(일의 자리 → 십의 자리 → 백의 자리 → ...)부터 비교하여 완성하는 정렬
d 는 자릿수
O(dN)
참고: 기본 정렬 알고리즘(Sorting Algoritm) 요약 정리(선택, 삽입, 버블, 합병, 퀵)v1.1
[참고: 정렬 알고리즘 특징/종류/시간 복잡도 선택, 삽입, 버블, 합병, 힙, 퀵, 기수
참고: 정렬 알고리즘을 알아봅시다!!:)