Computer programming/Algorithm
정렬 알고리즘 - 셸 정렬(Shell Sort)
대학원생(노예)
2022. 7. 13. 18:45
셸 정렬
- 단순 삽입 정렬의 장점을 살리고, 단점을 보완한 정렬 알고리즘
- 정렬할 배열의 요소를 그룹으로 나눠 각 그룹별로 단순 삽입 정렬을 수행하고, 그 그룹을 합치면서 정렬을 반복하여 요소의 이동 횟수를 줄이는 방법
- 셸 정렬은 개념을 이해하고 구현하기는 쉬우나 시간복잡도 분석은 조금 복잡하다.
장점
- 정렬을 맞쳤거나 정렬을 마친 상태에 가까워지면 정렬 속도가 매우 빨라진다.
단점
- 삽입할 위치가 멀리 떨어져 있으면 이동해야 하는 횟수가 많아진다.
셸 정렬 알고리즘의 예제
정렬 알고리즘 시간 복잡도 비교
Python Code
def Shellsort(arr):
h = 1
while h < len(arr):
h = 3*h + 1
h = h//3
while h > 0:
for i in range(h,len(arr)):
k=i-h
key=arr[i]
while k>=0 and key < arr[k]:
arr[k+h] = arr[k]
k=k-h
arr[k+h] = key
h = h//3
return arr
Java Code
public static void shellSort(Comparable[] array) {
//각 단계의 시작값
int[] cols = {1,5,12,23,62,145,367,815,1968,4711,11969,27901,84801,
213331,543749,1355339,3501671,8810089,21521774,
58548857,157840433,410151271,1131376761,2147483647};
int c;
for (c = 0; cols[c] < array.length / 4; c++)
;
// 매개변수 값에 대한 순환
for (; c >= 0; c--) {
int step = cols[c];
for (int i = step; i < array.length; i++) {
Comparable m = array[i];
int j;
for (j=i; j>=step; j-=step) {
if (isLastBigger(array[j-step],m))
break;
array[j] = array[j-step];
}
array[j] = m;
}