정렬에 대해 공부해본 내용을 정리해보겠습니당 -.
정렬 알고리즘은 안정된 알고리즘과 그렇지 않은 알고리즘으로 나뉩니다.
안정된 알고리즘 : 같은 값의 기를 가진 요소의 순서가 정렬 전후에도 유지되는 것
안정되지 않은 알고리즘 : 같은 점수인 경우 반드시 학번 순으로 정렬되는 것은 아님
정렬 알고리즘의 핵심 요소 교환, 선택, 삽입
O(n²)
2개씩 비교하면서 끝까지 감. -> 가장 작은 원소부터(가장 큰 원소부터) 끝에 쌓이게 됨.
멈춤O(n²)
가장 작은 요소부터 선택해 알맞은 위치로 옮겨서 순서대로 정렬하는 알고리즘
(현시점) 가장 작은 요소를 제일 앞 원소랑 위치 교환
O(n²)
선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 삽입하는 작업을 반복하여 정렬하는 알고리즘
-> 최소 원소를 교환하는(단순 선택 정렬) 것이 아니라 알맞은 위치로 옮기는 것
안정적임단순 삽입 정렬의 장점은 살리고 단점은 보완하여 좀 더 빠른 알고리즘
정렬할 배열의 요소를 그룹으로 나눠 각 그룹별로 단순 삽입 정렬을 수행하고, 그 그룹을 합치면서 정렬을 반복하여 요소의 이동 횟수를 줄이는 방식
O(n logn)
가장 빠른 정렬 알고리즘 중의 하나로 사용됨
2-1. 왼쪽 커서 >= x 가 성립하는 요소를 찾을 때까지 왼쪽 커서를 오른쪽으로 옮김.
2-2. 오른쪽 커서 <= x 가 성립하는 요소를 찾을 때까지 오른쪽 커서를 왼쪽으로 옮김.
O(n logn)
배열의 앞부분과 뒷부분으로 나누어 각각 정렬한 다음 병합하는 작업을 반복하여 정렬을 수행하는 알고리즘
-> 두 배열을 비교하면서 작은 요소들을 순차적으로 새 배열에 append
O(n logn)
선택 정렬을 응용한 알고리즘
힙: 부모의 값이 자식의 값보다 항상 크다는 조건을 만족하는 완전이진트리
가장 큰 값이 루트에 위치하는 특징을 이용한 정렬 알고리즘
-> 힙에서 가장 큰 값이 루트를 꺼냄
-> 힙의 마지막 요소를 루트 위치로 옮김
(이때, 루트를 제외하고는 힙 상태를 유지하고 있음)
-> 큰 값을 가지는 자식과 위치를 바꿈
-> 자식의 값이 작거나 리프 노드에 다다르면 작업이 종료됨
요소의 대소 관계를 판단하지 않고 빠르게 정렬할 수 있는 알고리즘