힐 정렬은 최대 수천 개의 데이터 항목에 대한 중간 크기 배열 정렬에 적합하지만, 힐 정렬은 시간 복잡도가 O(n*logn)인 다른 정렬 알고리즘만큼 빠르지 않습니다. 매우 큰 파일을 정렬하는 데 최적의 선택은 아니지만 Hill 정렬은 O(n²)의 시간 복잡도를 갖는 선택 정렬 및 삽입 정렬보다 훨씬 빠르고 구현이 매우 쉽고 코드가 짧습니다.
힐(Hill) 정렬도 삽입 정렬의 일종으로, 가장 작은 숫자가 끝에 오면 너무 많은 복사본이 나오는데, 힐(Hill)은 이 문제도 n-incremental 정렬로 해결한다. 요소 삽입 정렬을 수행하고 이러한 간격 요소 사이에서 삽입 정렬을 수행하면 이러한 데이터 항목이 한 번 정렬되면 Hill 정렬 알고리즘은 데이터 항목 간의 간격을 줄인 다음 정렬하는 방식으로 진행됩니다. 이러한 정렬을 수행할 때 데이터 항목 사이의 간격을 증분이라고 하며 일반적으로 문자 h로 표시됩니다.
Hill로 정렬하려는 배열의 경우 시작 간격이 더 커야 하며 간격이 1이 될 때까지 간격이 계속 감소해야 합니다.
스페이서 순서:
간격이 있는 시퀀스의 숫자 품질은 종종 중요한 것으로 간주됩니다. 1 이외의 공통 약수는 없습니다. 이러한 제약으로 인해 각 정렬 단계가 이전 단계의 효과를 유지할 가능성이 높아집니다. 조건은 점진적으로 감소하는 간격이 최종적으로 1과 같아야 한다는 것입니다. 따라서 마지막 패스는 일반적인 삽입 정렬입니다.
아래 나열된 예는 h=h*3+1 규칙에서 파생되었습니다.
package com.jll.sort; public class ShellSort { int[] arr; public ShellSort() { super() } public ShellSort(int size) { this.size = size]; } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" " ); } ss.shellSort(); System.out.println("정렬 후:"); System.out.print(ss.arr[i]+" "); } } public void shellSort(){ int h = 1; while(h<=size/3){ h = h*3+1 } (;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; while(j>h-1&&arr[jh]>temp){ arr[j]=arr[jh] j-=h } arr[j]=temp;