삽입 정렬의 장점은 살리고 단점은 보완하여 좀 더 빠르게 정렬하는 알고리즘
위에서 공부한 삽입정렬 특징을 간략하게 정리하자면
셸정렬 알고리즘의 순서이다.
셸 정렬에서 수행하는 각각의 정렬을 'h-정렬' 이라고 한다.
그림으로 바로 살펴보자.
2-정렬 까지 마치고 나면 배열은 좀 더 정렬된 상태에 가까워 진다.
마지막으로 '1-정렬' 인 일반적인 삽입정렬을 수행한다.
정리하면, 정렬되지 않은 상태의 배열에 대해 단순하게 삽입정렬을 적용하는 것이 아니라
'4-정렬', '2-정렬' 처럼 조금이라도 정렬이 된 상태에 가까운 배열로 만든 다음 마지막 삽입정렬
을 하는 것이다.
정렬해야하는 횟수는 늘지만 전체적으로 요소 이동 횟수가 줄어들어 효율적인 정렬을 할 수 있다.
public class ShellSortTest {
public static void shellSort(int[] arr) {
// h 인덱스를 기준으로 비교 시작
// h는 현재를 반으로 나눈 기준으로 잡았다.
// 삽입 정렬 코드와 거의 같다. 차이점은 선택한 요소와 비교하는 요소가
// 이웃하지 않고 h 만큼 떨어져 있다.
for (int h = arr.length / 2; h > 0; h /= 2 ) {
for (int i = h; i < arr.length; i++) {
int idx = i - h;
int tmp = arr[i];
while( (idx >= 0) && (arr[idx] > tmp) ) {
arr[idx + h] = arr[idx];
idx -= h;
}
arr[idx + h] = tmp;
}
}
}
public static void main(String[] args) {
int[] arr = {3, 1, 2, 6, 7 , 5, 4};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
}
장점
단점