peewoong 2024. 4. 12. 20:58

🟩 μ‚½μž… μ •λ ¬μ˜ μž₯점은 살리고, 단점은 λ³΄μ™„ν•˜μ—¬ μ’€ 더 λΉ λ₯΄κ²Œ μ •λ ¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ 

μ‚½μž… μ •λ ¬μ˜ 보완

μ‚½μž… 정렬은 초기 λ¦¬μŠ€νŠΈκ°€ "거의 보완"λ˜μ–΄ μžˆμ„ 경우 효율적

 

μ •λ ¬λ˜μ§€ μ•Šμ€μƒνƒœμ˜ 배열에 λŒ€ν•΄ λ‹¨μˆœν•˜κ²Œ μ‚½μž…μ •λ ¬μ„ μ μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ

'4-μ •λ ¬', '2-μ •λ ¬'처럼 μ‘°κΈˆμ΄λΌλ„ 정렬이 된 μƒνƒœμ— κ°€κΉŒμš΄ λ°°μ—΄λ‘œ λ§Œλ“  λ‹€μŒ λ§ˆμ§€λ§‰ μ‚½μž…μ •λ ¬μ„ ν•˜λŠ” 것

μ •λ ¬ν•΄μ•Ό ν•˜λŠ” νšŸμˆ˜λŠ” λŠ˜μ§€λ§Œ, μ „μ²΄μ μœΌλ‘œ μš”μ†Œ 이동 νšŸμˆ˜κ°€ 쀄어듀어 효율적인 정렬을 ν•  수 μžˆλ‹€.

 

🟩 μˆœμ„œ

1. μ •λ ¬ν•  λ°°μ—΄μ˜ μš”μ†Œλ₯Ό 그룹으둜 λ‚˜λˆ  각 κ·Έλ£Ήλ³„λ‘œ μ‚½μž… μ •λ ¬ μˆ˜ν–‰

2. κ·Έ 그룹을 ν•©μΉ˜λ©΄μ„œ 정렬을 λ°˜λ³΅ν•˜μ—¬ μš”μ†Œμ˜ 이동 횟수λ₯Ό 쀄인닀

3. μœ„μ˜ 과정을 그룹의 κ°œμˆ˜κ°€ 1이 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

🟩 λ‚˜λˆ„λŠ” 간격 k

간격 k의 μ΄ˆκΉƒκ°’ : (λ°μ΄ν„°μ˜ 갯수) / 2

λ§€ νšŒμ „λ§ˆλ‹€ kλŠ” 절반으둜 λ‚˜λˆˆλ‹€. 항상 ν™€μˆ˜κ°€ λ˜λ„λ‘ 값을 μˆ˜μ •ν•œλ‹€(짝수인 경우 + 1)

kκ°€ 1이 될 λ•ŒκΉŒμ§€ 반볡

'k-μ •λ ¬'이라 뢀름 예) 5-μ •λ ¬

 

 

🟩 μž₯단점

(μž₯) 연속적이지 μ•Šμ€ 리슀트의 κ΅ν™˜μ΄ μΌμ–΄λ‚˜λ©΄ 더 큰 거리λ₯Ό 이동

(μž₯) κ΅ν™˜λ˜λŠ” μš”μ†Œλ“€μ΄ μ‚½μž…μ •λ ¬λ³΄λ‹€ μ΅œμ’…μœ„μΉ˜μ— μžˆμ„ κ°€λŠ₯성이 더 λ†’μ•„μ§„λ‹€.

(단) k 간격을 잘λͺ» μ„€μ •ν•œλ‹€λ©΄ μ„±λŠ₯이 ꡉμž₯히 μ•ˆ μ’‹μ•„μ§ˆ 수 μžˆλ‹€.

πŸ‘‰ 보톡 μ „μ²΄μ—μ„œ h/2λ₯Ό ν•˜μ§€λ§Œ 이보닀 h/3 + 1이 더 λΉ λ₯΄λ‹€.

 

🟩 μ‹œκ°„λ³΅μž‘λ„

O(n^1.5)

ShellSort(A[ ], n)	{
	int i, j, temp;
    int gap = len / 2;
    while (gap > 0) {
        for (i = gap; i < len; i++) {
            temp = arr[i];
            j = i;
            while (j >= gap && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
        gap /= 2;
    }
}