삽입 정렬은 거의 정렬된 데이터를 처리할 때 매우 효율적입니다. 즉, 선형 정렬의 효율성을 얻을 수 있습니다.
그러나 삽입 정렬은 한 번에 1비트만 데이터를 이동할 수 있기 때문에 일반적으로 비효율적입니다.
힐 정렬은 디자이너 Donald Shell의 이름을 따서 명명되었으며 알고리즘은 1959년에 발표되었습니다. 일부 오래된 교과서와 참고 설명서에는 Marlene Metzner Norton의 이름이 포함된 알고리즘 Shell-Metzner가 지정되어 있지만 Metzner 자신에 따르면 "나는 이 알고리즘에 대해 아무것도 하지 않았으며 내 이름이 알고리즘에 표시되어서는 안 됩니다"
Hill 정렬의 기본 아이디어: 먼저 n보다 작은 정수 d1을 첫 번째 증분으로 취하고 파일의 모든 레코드를 d1 그룹으로 나눕니다. 거리가 d1의 배수인 모든 레코드는 동일한 그룹에 배치됩니다. 먼저 각 그룹 내에서 직접 삽입 정렬을 수행한 다음 두 번째 증분 d2
이 방법은 본질적으로 그룹화된 삽입 방법입니다.
예시 1:
/**
* 내림차순 증분 정렬 알고리즘이라고도 하는 힐 정렬은 삽입 정렬보다 더 효율적이고 향상된 버전입니다. Hill 정렬은 불안정한 정렬 알고리즘입니다.
*
* 힐 정렬은 삽입 정렬의 다음 두 가지 속성을 기반으로 개선된 방법을 제안합니다.
*
* 삽입 정렬은 거의 이미 정렬된 데이터, 즉 선형 정렬의 효율성을 얻을 수 있습니다
* 그러나 삽입 정렬은 한 번에 한 비트만 이동할 수 있기 때문에 일반적으로 비효율적입니다
*
*/
function shellSort( list ) {
var gap = Math.floor( list.length / 2 );
while( gap > 0 ) {
for( i = gap; i < list.length; i ) {
temp = list[i];
for( j = i; j >= gap && list[ j - 간격 ] > j -= 간격 ) {
목록[j] = 목록[j - 간격];
목록[j] = 온도;
}
간격 = Math.floor( gap / 2 );
}
return list;
};
// test
var arr = [2, 1, 3 , 12, 5, 66, 23, 87, 15, 32];
shellSort(arr);
예시 2: