๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ—ฃ๏ธ ์‹ ์ž… ์ธํ„ฐ๋ทฐ/C++

์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ : C++ ์ •๋ ฌ ์ด์ •๋ฆฌ (๋ฒ„๋ธ”, ์‚ฝ์ž…, ์„ ํƒ, ํ€ต, ํž™, ๋ณ‘ํ•ฉ)

https://velog.io/@jinh2352/%EC%A0%95%EB%A0%AC-%EA%B8%B0%EB%B3%B8
https://d2.naver.com/helloworld/0315536

 

ํ™”์ดํŠธ๋ณด๋“œ๋‚˜ ์ข…์ด๋‚˜ ๋น„์ฅฌ์–ผ ์ŠคํŠœ๋””์˜ค์— ์ž‘์„ฑํ•˜๋ฉด์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฒ„๋ธ”, ์‚ฝ์ž…, ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•ด์„œ๋Š” ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋‚˜ ์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ๋ถ€๋ถ„์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ ์„ ๋•Œ๋Š” ์‚ฝ์ž… ์ •๋ ฌ์ด ๋‹ค๋ฅธ ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ O(NlogN) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ, ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ์™€ ์บ์‹œ ํšจ์œจ ๋ฌธ์ œ๋กœ ์ธํ•ด ํ‰๊ท ์ ์ธ ์„ฑ๋Šฅ์ด ํ€ต ์ •๋ ฌ๋ณด๋‹ค ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•ฉ๋ณ‘ ์ •๋ ฌ๊ณผ ํ€ต ์ •๋ ฌ์€ ๋‘˜ ๋‹ค ํšจ์œจ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์ง€๋งŒ, ์ž‘๋™ ๋ฐฉ์‹์— ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ž‘๋™ ์›๋ฆฌ: ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ ๋ถ€๋ถ„์„ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ ํ•ฉ์น˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ํ€ต ์ •๋ ฌ์€ ํ”ผ๋ฒ—์„ ์„ ํƒํ•˜์—ฌ ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค, ๊ฐ ๋ถ€๋ถ„์„ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณต๊ฐ„ ๋ณต์žก๋„: ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ถ”๊ฐ€ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ€ต ์ •๋ ฌ์€ ์ง€์—ญ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ํ™œ์šฉ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ€ต ์ •๋ ฌ์˜ ์†๋„๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.
    • ๋ฐ˜๋ฉด ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ถ„ํ• ๋œ ๋ฐฐ์—ด์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ๋™์‹œ์— ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์—, ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ: ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, ํ€ต ์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊นŒ์ง€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ํ€ต ์ •๋ ฌ์€ ์‹ค์ œ ์ ์šฉ์—์„œ๋Š” ํ”ผ๋ฒ—์„ ์ž˜ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ๋žœ๋คํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)
  4. ์•ˆ์ •์„ฑ: ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์•ˆ์ • ์ •๋ ฌ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ์•ˆ์ •์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ํ‰๊ท  ์„ฑ๋Šฅ: ํ‰๊ท ์ ์œผ๋กœ, ํ€ต ์ •๋ ฌ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ ๋” ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ด๋‚˜, ํŠน์ • ๋ฐ์ดํ„ฐ์…‹์—์„œ๋Š” ํ•ฉ๋ณ‘ ์ •๋ ฌ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํž™ ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๊ฑฐ์˜ ์—†๊ณ , ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ๊ดœ์ฐฎ์€ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ƒ๋Œ€์  ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ถˆ์•ˆ์ •ํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ด๋ผ๋Š” ์ ์—์„œ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํž™ ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๊ฑฐ์˜ ์—†๊ณ , ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ๊ดœ์ฐฎ์€ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ƒ๋Œ€์  ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ถˆ์•ˆ์ •ํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ด๋ผ๋Š” ์ ์—์„œ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํž™ ์ •๋ ฌ์ด ํ€ต ์ •๋ ฌ์ด๋‚˜ ํ•ฉ๋ณ‘ ์ •๋ ฌ์— ๋น„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋œ ํšจ์œจ์ ์ด๋ผ๊ณ  ์—ฌ๊ฒจ์ง€๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์บ์‹œ ํšจ์œจ์„ฑ: ํž™ ์ •๋ ฌ์€ ์ด์ง„ ํž™์˜ ํŠน์„ฑ์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์ด ์—ฐ์†์ ์ด์ง€ ์•Š์•„ ์บ์‹œ ํ™œ์šฉ์ด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ํ€ต ์ •๋ ฌ๊ณผ ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋” ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด์„ ๊ฐ€์ง€๋ฉฐ, ํŠนํžˆ ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ˆœ์ฐจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ๋†’์€ ์บ์‹œ ํšจ์œจ์„ฑ์„ ๋ณด์ž…๋‹ˆ๋‹ค.
  2. ๋น„๊ต ๋ฐ ๊ตํ™˜ ํšŸ์ˆ˜: ํž™ ์ •๋ ฌ์€ ํž™์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ๋น„๊ต์™€ ์š”์†Œ ๊ตํ™˜์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ํ‰๊ท ์ ์ธ ๊ฒฝ์šฐ ๋” ์ ์€ ๋น„๊ต์™€ ๊ตํ™˜์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋น„๊ต์™€ ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ: ํ€ต ์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, ํ‰๊ท ์ ์œผ๋กœ๋Š” O(NlogN) ์ด๋ฉฐ, ํ”ผ๋ฒ— ์„ ํƒ ์ „๋žต์— ๋”ฐ๋ผ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— O(NlogN) ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํž™ ์ •๋ ฌ๋„ O(NlogN) ์˜ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์•ˆ์ •์„ฑ: ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์•ˆ์ •์ ์ธ ์ •๋ ฌ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ฉด, ํž™ ์ •๋ ฌ์€ ๋ถˆ์•ˆ์ •ํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ ์—ญ์‹œ ๋ถˆ์•ˆ์ •ํ•˜์ง€๋งŒ, ํ‰๊ท ์ ์ธ ์„ฑ๋Šฅ์ด ๋” ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ตฌํ˜„ ๋ณต์žก์„ฑ: ํž™ ์ •๋ ฌ์€ ์ด์ง„ ํž™ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌํ˜„์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ , ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ‘ํ•ฉ ๊ณผ์ •์ด ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€...

์•ˆ์ •์ ์ธ ์ •๋ ฌ ๋ฐฉ๋ฒ•(Stable Sorting Algorithm)์ด๋ž€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค์˜ ์ƒ๋Œ€์ ์ธ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ๊ณผ์ •์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ •๋ ฌ ์ „ํ›„๋กœ ๊ฐ™์€ ๊ฐ’์˜ ์š”์†Œ๋“ค ์‚ฌ์ด์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋“ค์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
[('apple', 2), ('orange', 1), ('banana', 2)]
์—ฌ๊ธฐ์„œ ์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ˆ์ •์ ์ธ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
[('orange', 1), ('apple', 2), ('banana', 2)]
apple๊ณผ banana๋Š” ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€์ง€๋งŒ, ์ •๋ ฌ ์ „ apple์ด banana๋ณด๋‹ค ๋จผ์ € ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ํ›„์—๋„ ๊ทธ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ˆ๋กœ๋Š” ๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort), ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort), ์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์„ ํƒ ์ •๋ ฌ(Selection Sort)๊ณผ ํ€ต ์ •๋ ฌ(Quick Sort)๊ณผ ํž™ ์ •๋ ฌ(Heap Sort) ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•ˆ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ๋ณ„์€ ํŠนํžˆ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์•ˆ์ •์ ์ธ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ๋ฒ„๋ธ” ์ •๋ ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N^2), ๋ฉ”๋ชจ๋ฆฌ: O(1)

 

 

๐Ÿ“Œ์†Œ๊ฐœ

๋ฒ„๋ธ” ์ •๋ ฌ์€ ์ธ์ ‘ํ•œ ๋‘ ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

 

1. ์ธ์ ‘ํ•œ ๋‘ ์ˆ˜๋ฅผ ๋Œ€์†Œ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

2. ๋‚ด๋ฆผ์ฐจ์ˆœ, ์˜ค๋ฆ„์ฐจ์ˆœ์— ๋”ฐ๋ผ ๋‘ ์ˆ˜์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.

3. ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค๋„ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜์—ฌ ์ฝ”๋“œ ๊ตฌํ˜„์ด ์‰ฝ์ง€๋งŒ, ๋น„๊ต ์ž‘์—…์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n^2) ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ• ๋•Œ๋Š” ๋ฒ„๋ธ” ์ •๋ ฌ์„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ์‹œ ์—„์ฒญ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค. 

 

์ถœ์ฒ˜ https://meongj-devlog.tistory.com/193 

 

๐Ÿ“Œ์ฝ”๋“œ

#include <vector>
#include <algorithm>
using namespace std;

void bubble_sort(vector<int>& v)
{
	const int n = v.size();
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (v[j] > v[j + 1]) swap(v[j], v[j + 1]);
		}
	}
}

 


๐Ÿ—ฃ๏ธ ์‚ฝ์ž… ์ •๋ ฌ ์ตœ์„ ์˜ ์‹œ๊ฐ„: O(n), ์ตœ์•…์˜ ์‹œ๊ฐ„: O(n^2), ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)

 

 

์‚ฝ์ž…์ •๋ ฌ ์˜ˆ์‹œ(wikipedia)

 

๐Ÿ“Œ์†Œ๊ฐœ

์‚ฝ์ž…์ •๋ ฌ์€ ์ž๋ฃŒ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ
์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ์ •๋ ฌ์„ ์™„์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

 

+ ์† ์•ˆ์˜ ์นด๋“œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ์นด๋“œ๋ฅผ ์ •๋ ฌ๋œ ์นด๋“œ ์‚ฌ์ด์˜ ์•Œ๋งž์€ ์‚ฌ์ด๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•ด์ค๋‹ˆ๋‹ค.

 

๋‘๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ทธ ์•ž ์›์†Œ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ์›์†Œ๋ฅผ ๋’ค๋กœ ์˜ฎ๊ธฐ๊ณ 
๊ทธ ์ž๋ฆฌ์— ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. 

 

๐Ÿ“Œ์‹œ๊ฐ„ ๋ณต์žก๋„

์ตœ์„ ์ผ ๊ฒฝ์šฐ (์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์Œ)

  • ์ด๋™์—†์ด 1๋ฒˆ์”ฉ ๋น„๊ตํ•  ๊ฒฝ์šฐ
  • ๋น„๊ต ํšŸ์ˆ˜: n - 1 ๋ฒˆ O(n)

์ตœ์•…์ผ ๊ฒฝ์šฐ (๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์Œ)

  • ๋น„๊ต ํšŸ์ˆ˜: ์™ธ๋ถ€ ๋ฃจํ”„ ์•ˆ์˜ ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค n - 1, n - 2, ... , 1 ๋ฒˆ์˜ ๋ฐ˜๋ณต
  • (n-1) + (n-2) + … + 2 + 1 = n(n-1)/2 = O(n^2)
  • ๊ตํ™˜ ํšŸ์ˆ˜: ์™ธ๋ถ€ ๋ฃจํ”„์˜ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค (i+2)๋ฒˆ์˜ ์ด๋™ ๋ฐœ์ƒ
  • n(n-1)/2 + 2(n-1) = (n^2+3n-4)/2 = O(n^2)

๐Ÿ“Œ์ฝ”๋“œ

#include <vector>
#include <iostream>
using namespace std;

void insertion_sort(vector<int>& v)
{
	const int n = v.size();
	for (int i = 1; i < n; i++)
	{
		int key = v[i];
		int  j = i - 1;

		while (j >= 0 && v[j] > key)
		{
			v[j + 1] = v[j];
			j = j - 1;
		}
		v[j + 1] = key;
	}
}

 

๐Ÿ“Œ ์ถœ์ฒ˜

https://meongj-devlog.tistory.com/194 ๐Ÿ’™์‹œ๊ฐ„ ๋ณต์žก๋„

https://blackon29.tistory.com/4 ๐Ÿ’™ ์ฝ”๋“œ

 https://gguzunhee.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B0%9C%EB%85%90-%EC%82%BD%EC%9E%85-%EC%A0%95%EB%A0%AC-insertion-sort-c ๐Ÿ’™ ์†Œ๊ฐœ

 

๋ฒ„๋ธ”, ์‚ฝ์ž…, ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•ด์„œ๋Š” ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋‚˜ ์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ๋ถ€๋ถ„์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ ์„ ๋•Œ๋Š” ์‚ฝ์ž… ์ •๋ ฌ์ด ๋‹ค๋ฅธ ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—ฃ๏ธ ์„ ํƒ ์ •๋ ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2), ๊ณต๊ฐ„ ๋ณต์žก๋„:  O(1)

 

๐Ÿ“Œ์†Œ๊ฐœ

์„ ํƒ ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ๊ฐ€์žฅ ๋งจ ์•ž์œผ๋กœ ์ •๋ ฌํ•ด๋‚˜๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

 

1. ๋ฐฐ์—ด ์ค‘์— ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

2. ์ตœ์†Ÿ๊ฐ’์„ ๋งจ ์•ž์œผ๋กœ ์ •๋ ฌ์‹œํ‚จ๋‹ค.(swap)

3. ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•ด๋‚˜๊ฐ„๋‹ค.

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹จ์ˆœํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ์ ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋ฉฐ,

๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๐Ÿ“Œ์‹œ๊ฐ„ ๋ณต์žก๋„

๊ธฐ์ค€๊ฐ’๊ณผ ๋น„๊ต๊ฐ’๋“ค ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด์ค‘ for๋ฌธ ํ•„์š”
- ์ฒซ ๋ฒˆ์งธ ํšŒ์ „ ๋น„๊ต ํšŸ์ˆ˜ : 1 ๋ถ€ํ„ฐ (n-1) = n-1
- ๋‘ ๋ฒˆ์งธ ํšŒ์ „ ๋น„๊ต ํšŸ์ˆ˜ : 2 ๋ถ€ํ„ฐ (n-1) = n-2
               ...
=> ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ : n-1, n-2, ..., 2, 1 ๋ฒˆ
T(n) = (n-1)+(n-2)+...+2+1=n(n-1)/2 = O(n^2)

 

๐Ÿ“Œ ์ถœ์ฒ˜

https://meongj-devlog.tistory.com/194 

 

๐Ÿ“Œ์ฝ”๋“œ

void selection_sort(vector<int>& v)
{
	const int n = v.size();
	for (int i = 0; i < n - 1; i++)
	{
		int minIdx = i;
		for (int j = i + 1; j < n; j++)
		{
			// minIdx ๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ต์ฒด ํ›„ ๊ฐฑ์‹ 
			if (v[j] < v[minIdx])
				minIdx = j;
		}
		if (i != minIdx)
			swap(v[i], v[minIdx]);
	}
}

๐Ÿ—ฃ๏ธ ํ€ต ์ •๋ ฌ ํ‰๊ท ๊ณผ ์ตœ์„ ์˜ ์‹œ๊ฐ„: O(NlogN), ์ตœ์•…์˜ ์‹œ๊ฐ„ O(N^2) ... ํ€ต์ด๋ผ๋ฉฐ.

 

ํ€ต ์ •๋ ฌ์€ ๋ฌด์ž‘์œ„๋กœ ์„ ์ •๋œ ํ•œ ์›์†Œ(Pivot ์—ญํ• ) ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•œ๋‹ค.
์„ ์ •๋œ ์›์†Œ๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋“ค์€ ์•ž์—, ํฐ ์›์†Œ๋“ค์€ ๋’ค์— ๋ณด๋‚ธ๋‹ค. โžก ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์ด ๋ถ„ํ• ๋œ๋‹ค.
๋ฐฐ์—ด ๋ถ„ํ•  ์ž‘์—…์€ ์œ„์™€๊ฐ™์ด ์—ฐ์†๋œ swap ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
๋ฐฐ์—ด๊ณผ ๊ทธ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ถ„ํ• ํ•ด ๋‚˜๊ฐ€๋ฉด ๊ฒฐ๊ตญ์— ๋ฐฐ์—ด์€ ์ •๋ ฌ๋œ ์ƒํƒœ์— ๋„๋‹ฌํ•œ๋‹ค.

 

ํ•˜๋‚˜์˜ ๋ถ„ํ•  ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์›์†Œ(Pivot) ์ด ์ค‘๊ฐ„๊ฐ’, ์ ์–ด๋„ ์ค‘๊ฐ„๊ฐ’์— ๊ฐ€๊นŒ์šด ๊ฐ’์ด ๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์ด ์—†๊ธฐ์— ํ€ต ์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด O(N ^2)์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

ํ‰๊ท ์ ์œผ๋กœ๋Š” O(NLogN)์ด๋‹ค.

 

https://velog.io/@jifrozen/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A9%EB%B3%91%EC%A0%95%EB%A0%AC-%ED%80%B5%EC%A0%95%EB%A0%AC-%ED%9E%99%EC%A0%95%EB%A0%AC

 

ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ Pivot ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„์–ด ํ•˜๋‚˜๋Š” Pivot  ๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์˜ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Pivot  ๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์˜ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ, ๊ฐ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์œ„ ์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•ฉ๋ณ‘์ •๋ ฌ๊ณผ ๋‹ค๋ฅธ์ ์€ ํ•ฉ๋ณ‘์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ถ„ํ• ์ •๋ณตํ•˜๊ณ , ํ€ต์ •๋ ฌ์€ Pivot ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋‰˜์–ด ์ •๋ณตํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

์„œ๋กœ ๋–จ์–ด์ง„ ์›์†Œ๋ผ๋ฆฌ ๊ตํ™˜์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์•ˆ์ • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

Pivot ์„ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์€ 3๊ฐ€์ง€์ด๋‹ค. ์™ผ์ชฝ, ์ค‘์•™, ์˜ค๋ฅธ์ชฝ
์„ ํƒํ•จ์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋‘ ' Pivot '์„ ์„ค์ •ํ•˜๊ณ  Pivot  ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ๊ฐ™๋‹ค. ์ด๋ฅผ Partitioning ๊ณผ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.

Pivot  ์„ ์™ผ์ชฝ์œผ๋กœ ์„ ํƒํ•˜๋Š”๊ฒƒ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ ์„ ํƒ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒ ๋‹ค.

  1. Pivot  ์„ ํ•˜๋‚˜ ์„ ํƒํ•œ๋‹ค (์™ผ์ชฝ, ์ค‘์•™, ์˜ค๋ฅธ์ชฝ ์ž์œ ๋กญ๊ฒŒ)
  2. Pivot  ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์—์„œ๋Š” Pivot  ๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋Š” Pivot  ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
  3. ์–‘ ๋ฐฉํ–ฅ์—์„œ ์ฐพ์•˜๋‹ค๋ฉด ๋‘ ์›์†Œ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  4. ์™ผ์ชฝ ํƒ์ƒ‰ ์œ„์น˜๊ฐ€ ์˜ค๋ฅธ์ชฝ ํƒ์ƒ‰์œ„์น˜ ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋‹ค์‹œ 2๋ฒˆ๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋‘˜์˜ ์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด 5๋ฒˆ์œผ๋กœ
  5. ์—‡๊ฐˆ๋ฆฐ ๊ธฐ์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„์–ด 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€ ํ•ด๋‹น ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 1์ด ์•„๋‹ ๋•Œ ๊นŒ์ง€ 1๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค (๋ถ„ํ• )
  6. ๊ฒฐ๊ตญ ๋‚ฑ๊ฐœ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋˜์–ด์žˆ๊ณ  ๋‹ค ๋ถ„ํ• ํ•˜๋ฉด ์ธ์ ‘ํ•œ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋ผ๋ฆฌ ํ•ฉ์นœ๋‹ค (์ •๋ณต)

https://velog.io/@jifrozen/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A9%EB%B3%91%EC%A0%95%EB%A0%AC-%ED%80%B5%EC%A0%95%EB%A0%AC-%ED%9E%99%EC%A0%95%EB%A0%AC

#include <iostream>
using namespace std;
//ํ€ต์ •๋ ฌ
int n,cnt, quick[10000001];

void quickSort(int i, int j)
{
	if(i>=j) return;
	int pivot = quick[(i+j)/2];
	int left = i;
	int right = j;
	
	while(left<=right)
	{
		while(quick[left]<pivot) left++;
		while(quick[right]>pivot) right--;
		if(left<=right)
		{
			swap(quick[left],quick[right]);
			left++; right--;
		}
	}
	quickSort(i,right);
	quickSort(left,j);
}

๐Ÿ—ฃ๏ธ ํž™ ์ •๋ ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(NLogN)

 

๋จผ์ € ํž™ ์ •๋ ฌ์€ ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์ด๋‹ค. ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ ˆ๋ฒจ์— ๋ชจ๋“  Node๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์€ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋…ธ๋“œ๊ฐ€ ์ฑ„์›Œ์ง„ Tree๋ฅผ ๋งํ•œ๋‹ค.

 

๋ง ๊ทธ๋ž˜๋„ ์ตœ๋Œ€ํž™์˜ root๋Š” ์ œ์ผ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์€ `O(1)`์ด๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์ตœ๋Œ€๊ฐ’์„ ์‚ญ์ œํ•˜๋ฉด ๋นˆ ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์ฑ„์›Œ์ค˜์•ผํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ heap์€ ๋งจ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ๋Œ€์ฒดํ•œ ํ›„, heapify ๊ณผ์ •์„ ๊ฑฐ์ณ heap ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

 

ํž™์˜ ๊ฒฝ์šฐ๋Š” ์™„์ „ ์ •๋ ฌ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ณ  ๋Š์Šจํ•œ ์ •๋ ฌ ์ƒํƒœ์ด๋‹ค. ์™œ๋ƒ๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ •๋ ฌ๋œ์ฑ„ ์œ ์ง€๋˜๋Š”๊ฒƒ์ด ์•„๋‹Œ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ž์‹๋…ธ๋“œ๋ณด๋‹ค ํ•ญ์ƒ ํฐ๊ฐ’์ด๋ผ๋Š” ์กฐ๊ฑด๋งŒ ๋งŒ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ง๊ทธ๋Œ€๋กœ, ํ˜•์ œ๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค

 

C++์˜ ๊ฒฝ์šฐ ํ‘œ์ค€ ์šฐ์„ ์ˆœ์œ„ํ (๋‚ด๋ฆผ์ฐจ์ˆœ) ๊ฐ€ ํž™์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— C++ ์—์„œ ํž™์ •๋ ฌ์„ ์ด์šฉํ•˜๊ณ ์ž ํ•˜๋ฉด  `priority_queue`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ O(NlogN)์ด๋‹ค.

#include <vector>
#include <queue>
#include <algorithm>

void HeapSort(vector<int>& v)
// ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ ๋ฒกํ„ฐ v๋ฅผ ํž™ ์ •๋ ฌํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
{
    priority_queue<int, vector<int>, greater<int>> pq;
    // ์šฐ์„ ์ˆœ์œ„ ํ ์ƒ์„ฑ. 
    // priority_queue ์˜ ์„ธ ๋ฒˆ์งธ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋กœ greater<int> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 
    // ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ํฐ ๊ฐ’๊นŒ์ง€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๋„๋ก ์„ค์ •.
    // greater<int> ๋Š” C++ STL์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด (predicate) ์ด๋‹ค.

    // O(NlogN)
    for (int num : v)
        pq.push(num); // ์ž…๋ ฅ๊ฐ’๋“ค์„ pq์— ๋„ฃ์–ด์ฃผ๊ณ  // O(logN)

    v.clear(); // ๋ฒกํ„ฐ๋ฅผ ๋น„์›Œ์ค€๋‹ค.

    // O(NlogN)
    while (pq.empty() == false) // ์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋™์•ˆ
    {
        v.push_back(pq.top()); // O(1) // ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฒกํ„ฐ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
        pq.pop(); // O(logN) // ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
    }
}

 

์œ„์™€ ๊ฐ™์ด ์ •๋ ฌํ•œ๋‹ค๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ pq๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
๋งŒ์•ฝ heap์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์—†์ด ํž™์ •๋ ฌ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

ํž™์ •๋ ฌ์€ ์™„์ „์ด์ง„ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ์จ, ๋ฐฐ์—ด์„ ์™„์ „์ด์ง„ํŠธ๋ฆฌ ๊ผด๋กœ ์ƒ๊ฐํ•˜๊ณ  ๊ณ„์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ Left_Child, Right_Child, Parent_Node ๋“ฑ์„ ํŠน๋ณ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ ,

Index๋ฒˆํ˜ธ๋ฅผ ๋งˆ์น˜ ์™„์ „์ด์ง„ํŠธ๋ฆฌ ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.

heap์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋ฐ”๋กœ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋Š”๊ฒƒ์ด๋‹ค. ํž™์€ ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„๋‹ค.

์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ธ๋ฑ์Šค = ๋ถ€๋ชจ ๋…ธ๋“œ ์ธ๋ฑ์Šค x 2 + 1
์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ธ๋ฑ์Šค = ๋ถ€๋ชจ ๋…ธ๋“œ ์ธ๋ฑ์Šค x 2 + 2
๋ถ€๋ชจ ๋…ธ๋“œ ์ธ๋ฑ์Šค = (์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค - 1) / 2

 

ํž™ ์ •๋ ฌ์˜ ํ•ต์‹ฌ ๋‹จ๊ณ„๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  1. Heapify: ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ๋Š” ๋ฐฐ์—ด์˜ ๋น„๋ฆฌํ”„ ๋…ธ๋“œ (leaf node๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ) ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ๊พธ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ํž™ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๋„๋ก ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. Sort: ํž™์—์„œ ์ตœ๋Œ“๊ฐ’(๋˜๋Š” ์ตœ์†Ÿ๊ฐ’)์„ ์ถ”์ถœํ•˜๊ณ , ๋‚จ์€ ์š”์†Œ๋“ค๋กœ ํž™์„ ์žฌ๊ตฌ์„ฑํ•œ ํ›„, ๋ฐฐ์—ด์˜ ๋์—์„œ๋ถ€ํ„ฐ ์ •๋ ฌ๋œ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ heapify ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ํž™ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๋„๋ก ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

heap_sort ํ•จ์ˆ˜๋Š” ๋จผ์ € ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๊ฐ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

// Heapify ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
void heapify(vector<int>& v, int n, int i) {
    int largest = i; // ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค๋กœ i(๋ฃจํŠธ)๋ฅผ ์ดˆ๊ธฐํ™”
    int left = 2 * i + 1; // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ธ๋ฑ์Šค
    int right = 2 * i + 2; // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ธ๋ฑ์Šค

    // ์™ผ์ชฝ ์ž์‹์ด ๋ฃจํŠธ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ
    if (left < n && v[left] > v[largest])
        largest = left;

    // ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ํ˜„์žฌ ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ
    if (right < n && v[right] > v[largest])
        largest = right;

    // ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
    if (largest != i) {
        swap(v[i], v[largest]);
        // ์žฌ๊ท€์ ์œผ๋กœ ํ•˜์œ„ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด heapify๋ฅผ ํ˜ธ์ถœ
        heapify(v, n, largest);
    }
}

// ํž™ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
void heap_sort(vector<int>& v) {
    int n = v.size();

    // ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๊ตฌ์„ฑ
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(v, n, i);

    // ํ•˜๋‚˜์”ฉ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•˜๋ฉด์„œ ํž™์„ ์žฌ๊ตฌ์„ฑ
    for (int i = n - 1; i > 0; i--) {
        swap(v[0], v[i]); // ํ˜„์žฌ ๋ฃจํŠธ(๊ฐ€์žฅ ํฐ ๊ฐ’)๋ฅผ ๋์œผ๋กœ ์ด๋™
        heapify(v, i, 0); // ํž™์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์žฌ๊ตฌ์„ฑ
    }
}

int main() {
    vector<int> data = {12, 11, 13, 5, 6, 7};
    heap_sort(data);

    cout << "Sorted array: \n";
    for (int i : data)
        cout << i << " ";
    cout << endl;

    return 0;
}

๐Ÿ—ฃ๏ธ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(NLogN), ๊ณต๊ฐ„ ๋ณต์žก๋„: ๋ฉ”๋ชจ๋ฆฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

https://velog.io/@jifrozen/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A9%EB%B3%91%EC%A0%95%EB%A0%AC-%ED%80%B5%EC%A0%95%EB%A0%AC-%ED%9E%99%EC%A0%95%EB%A0%AC

 

๋ณ‘ํ•ฉ์ •๋ ฌ ๋˜๋Š” ํ•ฉ๋ณ‘์ •๋ ฌ์€ ์ •๋ ฌํ•  ๋ฐ์ดํ„ฐ๋“ค์„ ์ผ๋‹จ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ๊ณ  ๊ฐ ๊ฐ ์ •๋ ฌํ•œ ํ›„ ๋‚˜์ค‘์— ํ•ฉ์น˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋น„๊ต ๊ธฐ๋ฐ˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ณ , ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์•ˆ์ • ์ •๋ ฌ์— ์†ํ•˜๋ฉฐ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜์ด๋‹ค.

๋งค๋ฒˆ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด ๊ณต๊ฐ„์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋น„ํšจ์œจ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด์— ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ O(NlogN)์ด๋‹ค.

 

์ถœ์ฒ˜: https://meongj-devlog.tistory.com/197

 

ํ•ฉ๋ณ‘ = '๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ๋ถ„ํ• ํ•œ ๋ฌธ์ œ๋ฅผ ์ •๋ณตํ•˜์—ฌ ํ•ฉ์น˜๋Š” ๊ณผ์ •'์ด๋‹ค.
1. ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค. (๋ถ„ํ• )
2. ํ•ด๋‹น ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 1์ด ์•„๋‹ˆ๋ผ๋ฉด 1๋ฒˆ ๊ณผ์ •์„ ๋˜ํ’€์ดํ•œ๋‹ค.
3. ์ธ์ ‘ํ•œ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋ผ๋ฆฌ ์ •๋ ฌํ•˜์—ฌ ํ•ฉ์นœ๋‹ค. (์ •๋ณต)

 

https://velog.io/@jifrozen/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A9%EB%B3%91%EC%A0%95%EB%A0%AC-%ED%80%B5%EC%A0%95%EB%A0%AC-%ED%9E%99%EC%A0%95%EB%A0%AC

#include <vector>
#include <queue>
#include <algorithm>

/*
[3][K][7][2][J][4][8][9]
[3][K][7][2]  [J][4][8][9]
[3][K]  [7][2]  [J][4]  [8][9]
[3]  [K]  [7]  [2]  [J]  [4]  [8]  [9]
[3][K]  [7][2]  [J][4]  [8][9]
[3][K][7][2]  [J][4][8][9]
*/

void MergeResult(vector<int>& v, int left, int mid, int right)
{
    int leftIdx = left;
    int rightIdx = mid + 1;

    // ์ž„์‹œ ๋ฒกํ„ฐ
    vector<int> temp;

    // O(N)
    while (leftIdx <= mid && rightIdx <= right)
        // ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ๋‚จ์•„์žˆ๋‹ค๋ฉด
    {
        if (v[leftIdx] <= v[rightIdx])
        {
            temp.push_back(v[leftIdx]);
            leftIdx++; // ์ปค์„œ ์˜ฎ๊ฒจ์ฃผ๊ธฐ               
        }
        else
        {
            temp.push_back(v[rightIdx]);
            rightIdx++; // ์ปค์„œ ์˜ฎ๊ฒจ์ฃผ๊ธฐ                         
        }
    }

    // ์™ผ์ชฝ์ด ๋จผ์ € ๋๋‚ฌ๋‹ค๋ฉด (์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด ๋ณ‘ํ•ฉ์ด ๋ชจ๋‘ ๋๋‚˜๋ฉด)
    if (leftIdx > mid)
    {
        while (rightIdx <= right)
        {
            temp.push_back(v[rightIdx]);
            rightIdx++;
        }
    }
    // ์˜ค๋ฅธ์ชฝ์ด ๋จผ์ € ๋๋‚ฌ๋‹ค๋ฉด (์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ๋ชจ๋‘ ๋ณ‘ํ•ฉ๋˜์–ด ๋๋‚ฌ๋‹ค๋ฉด)
    else
    {
        while (leftIdx <= mid)
        {
            temp.push_back(v[leftIdx]);
            leftIdx++;
        }
    }

    // temp ์— ๋„ฃ์–ด์ค€ ๊ฑธ ์›๋ณธ์— ๋ฎ์–ด์“ฐ๊ธฐ
    for (int i = 0; i < temp.size(); i++)
        v[left + i] = temp[i];
}

// O(NlogN)
void MergeSort(vector<int>& v, int left, int right)
// ์˜์—ญ์„ ์ฐ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๋ณด๊ธฐ!
{
    if (left >= right)
        return;

    // ๋ถ„ํ• 
    int mid = (left + right) / 2;
    // ์žฌ๊ท€
    MergeSort(v, left, mid);
    MergeSort(v, mid + 1, right);

    // ๋‚˜๋‰œ ๊ฑธ ๋‹ค์‹œ ํ•ฉ์น˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
    MergeResult(v, left, mid, right);
}

int main()
{
    vector<int> v{ 1, 5, 3, 4, 2 };

    MergeSort(v, 0, v.size() - 1);
}

 


์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ผ.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„์€ ๊ต‰์žฅํžˆ ๋งŽ์ง€๋งŒ ํฌ๊ฒŒ ๋‹ค์„ฏ ๊ฐ€์ง€๋งŒ ์ถ”๋ฆฌ์ž๋ฉด

๋ฒ„๋ธ”์ •๋ ฌ, ์„ ํƒ์ •๋ ฌ, ์‚ฝ์ž…์ •๋ ฌ, ํ•ฉ๋ณ‘์ •๋ ฌ, ํ€ต์ •๋ ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๋ธ”์ •๋ ฌ : ์„œ๋กœ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์„œ ์ด์ค‘for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์†ํ•ด์„œ ๋‹ค์Œ์ธ๋ฑ์Šค๋ž‘ ๋น„๊ตํ›„ ๋ฐ”๊พธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์„ ํƒ์ •๋ ฌ : ์ œ์ž๋ฆฌ ์ •๋ ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ์„œ, ํ•ด๋‹น ์ˆœ์„œ์— ๋„ฃ์„ ์œ„์น˜๋Š” ์ •ํ•ด๋‘๊ณ  ์–ด๋–ค ์›์†Œ๋ฅผ ๋„ฃ์„์ง€ ์„ ํƒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ž๋ฃŒ๋ฅผ ๋‘๋ฒˆ์งธ ์ž๋ฃŒ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋น„๊ต ํ›„ ๊ฐ€์žฅ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„๋„ฃ๊ณ  ๋‘๋ฒˆ์จฐ ์ž๋ฃŒ๋Š” ์„ธ๋ฒˆ์งธ์ž๋ฃŒ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋น„๊ตํ•˜์—ฌ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฝ์ž…์ •๋ ฌ : ์ž๋ฃŒ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ž˜๋Œ€๋กœ ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ, ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•จ์œผ๋กœ์„œ ์ •๋ ฌ์„ ์™„์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ์ž๋ฃŒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ n - 1 ์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ž์‹ ์˜ ์•ž ์ž๋ฃŒ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ ํ›„ ์ž๋ฃŒ๊ฐ€ ์‚ฝ์ž…๋  ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์ •๋ ฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ•ฉ๋ณ‘์ •๋ ฌ :  ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ ๋‘๊ฐœ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ๊ฐ๊ฐ์„ ํ•ด๊ฒฐํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„์„œ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

ํ€ต์ •๋ ฌ(์ค‘์š”!)

ํ€ต์ •๋ ฌ : ๊ฐ€์žฅ๋น ๋ฅธ ์ •๋ ฌ๋ฐฉ์‹์ค‘ ํ•˜๋‚˜๋กœ์„œ ๋‹ค๋ฅธ์›์†Œ์˜ ๋น„๊ต๋งŒ์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๊ต์ •๋ ฌ์ด์ž ๋ถ„ํ• ํ•ด์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ถ„ํ• ์ •๋ณต์ •๋ ฌ์—๋„ ์†ํ•ฉ๋‹ˆ๋‹ค.

์ œ์ผ ์ค‘์š”ํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ด๋ฏ€๋กœ ์กฐ๊ธˆ ๊ธธ๊ฒŒ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ€ต์ •๋ ฌ์€ Pivot Point๋ผ๊ณ ํ•˜๋Š” ๊ธฐ์ค€๊ฐ’์„ ํ•˜๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์€๊ฐ’์„ ์™ผ์ชฝ, ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ถ„ํ• ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋˜๋ฉด ๋ฐฐ์—ด์ด ๋ชจ๋‘ ์ •๋ ฌ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„ํ–‰๋ฐฉ์‹์„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ•˜์ž๋ฉด

1. ๋งจ ์•ž์˜ ์ˆซ์ž๋ฅผ ํ”ผ๋ด‡์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

2. ํ”ผ๋ด‡์˜ ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ i, ๋ฐ์ดํ„ฐ์˜ ๋งจ ๋์„ j๋กœ ์ง€์ •ํ•˜๊ณ 

3. i๋Š” ์ฆ๊ฐ ์—ฐ์‚ฐํ•˜๋ฉด์„œ pivot๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ  j๋Š” ๊ฐ์‡ ์—ฐ์‚ฐํ•˜๋ฉด์„œ pivot๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

4. ๋งŒ์•ฝ i์™€ j๊ฐ€ ๊ต์ฐจ๋˜์ง€ ์•Š๊ณ  ์„œ๋กœ ์•Œ๋งž์€ ๊ฐ’์„ ์ฐพ์•˜๋‹ค๋ฉด i์˜ ๋ฐ์ดํ„ฐ์™€ j์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์™‘ํ•ฉ๋‹ˆ๋‹ค.

5. ์ฐพ๋Š” ๋„์ค‘ i > j ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด pivot๊ณผ j๋ฅผ ์Šค์™‘ ํ•˜๊ณ 

6. ์ด๋ฅผ ์‹คํ–‰ํ•˜์˜€๋‹ค๋ฉด pivot์˜ ์ขŒ์ธก์€ pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค๋งŒ ์šฐ์ธก์€ ํฐ๊ฐ’์„๋งŒ ์กด์žฌํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

7. ์ง€๊ธˆ๊นŒ์ง€ ์‹คํ–‰ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ pivot์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์ธก์—์„œ ์šฐ์ธก์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.(pivot์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.)

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ๋น ๋ฅธ ์ •๋ ฌ์ค‘ ํ•˜๋‚˜์ง€๋งŒ ๊ฐ–์•„ ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์— ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ์ •๋ ฌํ• ๊ฒฝ์šฐ O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒซ์งธ, ๋ฐฐ์—ด์˜ ์ฒซ์งธ๋‚˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์•„๋‹Œ ๋‚œ์ˆ˜๋ฅผ pivot ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” pivot์ด ํŽธํ–ฅ๋˜๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ, ์ค‘๊ฐ„ ์š”์†Œ, ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ค‘ ์ค‘๊ฐ„ ๊ฐ’์„ pivot์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ์—, ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์— ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘๊ฐ„ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์—์„œ ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ˆซ์ž์™€ ๊ตํ™˜ํ•˜๋ฉด ์žฌ๊ท€ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ๋ฐฐ์—ด์˜ ๋ถ„ํ• ์ด ๊ฐ€์šด๋ฐ์—์„œ ์ˆ˜ํ–‰๋  ํ™•๋ฅ ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.


Reference