D.evelop [CS]/Algorithm
[알고리즘 이론] 정렬 Sort - 2-4. 비교 기반 알고리즘 (셸 정렬)
Danne
2024. 5. 13. 19:10
정렬 Sort
1. 기본 개념
2. 비교 기반 알고리즘
1) 선택 정렬
2) 버블 정렬
3) 삽입 정렬
4) 셸 정렬
💡예시에 대한 가정
- 입력 크기 n
- 입력 배열 A[0…. n-1]
- 입력 데이터 : 양의 정수
- 정렬 방식 : 오름차순 (1, 2, 3, 4,…)
2-3) 셸 정렬 (Shell sort)
- 삽입 정렬의 단점인 “올바른 삽입 위치에서 멀어도 한자리씩 비교하며 이동” 해야하는 과정을 보완
- 멀리 떨어진 데이터와 비교, 교환하여 한번에 이동할 수 있는 거리를 늘림 → 처리 속도 향상
- 삽입 정렬
처리해야할 데이터에서 가까운 값과 비교 → 점점 멀리 - 셸 정렬
처리해야할 데이터에서 멀리 떨어진 값과 비교 → 점점 가까이
- 삽입 정렬
- 입력 배열을 부분배열로 나누어 삽입 정렬을 수행하는 과정을 부분배열의 크기와 개수를 줄여가면서 반복적으로 수행
- 부분배열 개수 정하는 방법
- 순열 (양수 ℎ₁, ⋯ , ℎₖ₋₁ , ℎₖ)
- ℎₖ의 의미
- 부분 배열 개수
- 각 부분배열 내에서 이웃한 데이터 간의 거리
- ℎₖ의 의미
- 순열 (양수 ℎ₁, ⋯ , ℎₖ₋₁ , ℎₖ)
3. 특징
- 순열에 따라 최선 O(nlogn) ~ 최악 O(n²)
- 사용하는 순열에 따라 성능이 달라짐
- 가장 좋은 간격을 정하는 것은 미해결 과제이다.
- 순열 값은 역순으로 적용 (ℎₖ₋₁ , ℎₖ, ℎₖ₋₁, … ℎ₁)
- 제자리 정렬 알고리즘 : 입력 배열 A 이외 상수개(i, j, val) 의 저장 공간만 필요
- 안정적이지 않은 알고리즘
[JS code]
function shellSort(A) {
const n = A.length; // 배열 A의 길이를 n에 저장합니다.
for (let D = Math.floor(n / 2); D >= 1; D = Math.floor(D / 2)) { // D: ℎₖ에 해당, 부분배열의 개수 & 간격의 크기
//=============⬇️ 삽입 정렬 과정=============
for (let i = D; i < n; i++) { // i를 D부터 n-1까지 증가. 삽입정렬에서는 i=1이었음.
let val = A[i];
for (let j = i; j >= D && A[j - D] > val; j -= D) { // 간격 D만큼 떨어진 위치에서 삽입 정렬을 수행
A[j] = A[j - D]; // A[j-D]가 val보다 크면 간격 D만큼 뒤로 이동
}
A[j] = val; // 찾아진 위치에 val을 삽입
}
//==============⬆️ 삽입 정렬 과정=============
}
return A; // 정렬된 배열을 반환합니다.
}
반응형