CS 곡뢀

μ…Έ μ •λ ¬ (shell sort) μ•Œκ³ λ¦¬μ¦˜

은진 2021. 10. 14. 17:42

μ…Έ μ •λ ¬μ˜ λ“±μž₯

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

μ‚½μž… 정렬은 μ΄ˆκΈ°λ¦¬μŠ€νŠΈκ°€ "거의 μ •λ ¬"λ˜μ–΄ μžˆμ„ 경우 νš¨μœ¨μ μ΄λ‹€.

μ—­μˆœμœΌλ‘œ μ •λ ¬λœ μ΅œμ•…μ˜ 경우, 이동을 많이 ν•΄μ•Ό μ΅œμ’… μœ„μΉ˜μ— λ‹€λ‹€λ₯Ό 수 μžˆλ‹€.

 

 

μ‚½μž… μ •λ ¬μ˜ μ‹œκ°„λ³΅μž‘λ„

O(n) : 이미 μ •λ ¬λœ μ΅œμ„ μ˜ 경우, n-1번의 1회차 λΉ„κ΅λ§Œ μˆ˜ν–‰ν•œλ‹€.

O(n^2) : μ—­μˆœμœΌλ‘œ μ •λ ¬λœ μ΅œμ•…μ˜ 경우 1+2+3+ ... + (n-2) + (n-1) = 총 n(n-1)/2번 μ΄λ™ν•œλ‹€.

 

 

 

 

μ…Έ μ •λ ¬

  1. 데이터λ₯Ό μ‹­μˆ˜ 개 정도 듬성듬성 λ‚˜λˆ„μ–΄μ„œ μ‚½μž… μ •λ ¬ν•œλ‹€.
  2. 데이터λ₯Ό λ‹€μ‹œ 잘게 λ‚˜λˆ„μ–΄μ„œ μ‚½μž… μ •λ ¬ν•œλ‹€.
  3. μ΄λ ‡κ²Œ 계속 ν•˜μ—¬ λ§ˆμΉ¨λ‚΄ 정렬이 λœλ‹€.

 

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

  • 간격 k의 μ΄ˆκΉƒκ°’ : (데이터 개수) / 2
  • 맀 νšŒμ „λ§ˆλ‹€ kλŠ” 절반으둜 λ‚˜λˆˆλ‹€. 단, 항상 ν™€μˆ˜κ°€ λ˜λ„λ‘ 값을 μˆ˜μ •ν•œλ‹€. (짝수인 경우 +1)
    • ν™€μˆ˜λ‘œ λ‹€λ£¨λŠ” 것이 μ„±λŠ₯에 더 쒋은 영ν–₯을 λΌμΉœλ‹€λŠ” 연ꡬ κ²°κ³Ό..
  • kκ°€ 1이될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

 

 

 

 

 

리슀트λ₯Ό λΆ€λΆ„ 리슀트둜 λ‚˜λˆˆ ν›„ μ‚½μž…μ •λ ¬μ„ ν•  λ•Œ, 각 λ°μ΄ν„°λŠ” κΈ΄ 거리λ₯Ό μ΄λ™ν•œλ‹€.

λ”°λΌμ„œ 각 μš”μ†Œκ°€ μ΅œμ’… μœ„μΉ˜μ— μžˆμ„ ν™•λ₯ μ΄ 높아진닀.

(μ‚½μž… 정렬은 ν•œ λ²ˆμ— ν•œ μš”μ†Œμ˜ μœ„μΉ˜λ§Œ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ μ΄λ‹€. )

 

 

μ…Έ μ •λ ¬μ—μ„œ 간격이 1일 λ•Œ μ‚½μž… 정렬을 ν•˜μ§€λ§Œ, λ°°μ—΄μ˜ 처음 μƒνƒœλ³΄λ‹€ μ–΄λŠ 정도 정렬이 λ˜μ–΄μžˆμœΌλ―€λ‘œ, μ²˜μŒλΆ€ν„° μ‚½μž… 정렬을 ν•˜λŠ” 것보닀 속도가 λΉ λ₯΄λ‹€.

 

 

 

 

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

μ΅œμ„ : T(n) = O(n) : μ‚½μž… μ •λ ¬μ²˜λŸΌ 이미 μ •λ ¬λœ 경우, 1νšŒμ°¨μ—μ„œ λΉ„κ΅λ§Œ μˆ˜ν–‰ν•œλ‹€.

평균: T(n) = O(n^1.3) ~ O(n^1.5) : 계산방법이 νž˜λ“€λ‹€κ³  ν•˜λ‹ˆ μ•Œμ•„λ‘κΈ°λ§Œ ν•˜μž.
μ΅œμ•…: T(n) = O(n^2) 

 

 

λΆˆμ•ˆμ • μ •λ ¬

μ…Έ 정렬은 μ •λ ¬ 이후 초기 μˆœμ„œμ™€ λ‹¬λΌμ§ˆ 수 μžˆλŠ” λΆˆμ•ˆμ • 정렬이닀.

[25, 25, 6, 20, 4, 3, 22, 1, 0, 15, 16]   k = 5

[3, 25, 6, 20, 4, 16, 22, 1, 0, 15, 25]   k = 5

 

 

 

 

 

 

좜처

https://gmlwjd9405.github.io/2018/05/08/algorithm-shell-sort.html

 

[μ•Œκ³ λ¦¬μ¦˜] μ…Έ μ •λ ¬(shell sort)μ΄λž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io