๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

https://www.resultswebdev.com/bubble-sort-algorithm/

์†Œ๊ฐœ

๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ '๊ฑฐํ’ˆ(Bubble)'์ฒ˜๋Ÿผ ์„œ๋กœ ๊ตํ™˜ํ•ด ๊ฐ€๋ฉฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์„œ๋กœ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋‚˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋…

๋ฒ„๋ธ” ์ •๋ ฌ์˜ ๊ฐœ๋…์€ ๋งŒ์•ฝ ์ˆซ์ž ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋” ํฐ ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋’ค๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ํ•ญ๋ชฉ์ด ๋” ํฌ๋ฉด ๊ตํ™˜ํ•˜๊ณ , ๋‹ค์Œ ํ•ญ๋ชฉ๊ณผ ๋น„๊ตํ•˜๊ณ , ๋‹ค์Œ ํ•ญ๋ชฉ๋ณด๋‹ค ๋” ํฌ๋ฉด ๋˜ ๊ตํ™˜์„ ํ•˜๊ณ , ๋‹ค์‹œ ๋‹ค์Œ ํ•ญ๋ชฉ๊ณผ ๋น„๊ตํ•˜๋ฉด์„œ ๋ฐ˜๋ณต์„ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฆ„์ฐจ์ˆœ์˜ ์ƒํ™ฉ์—์„œ๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์ƒ๋‹จ์„ ํ–ฅํ•ด์„œ ๊ฐ’์„ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชฉ๋ก์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ #1

function bubbleSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

๊ธฐ๋ณธ์ ์ธ ๋ฒ„๋ธ” ์ •๋ ฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ ์ธ์ ‘ํ•œ ์›์†Œ์— ๋Œ€ํ•ด์„œ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ์—์„œ๋Š” ๋ฒ„๋ธ” ์ •๋ ฌ์ด ์ž‘๋™ํ•˜๋Š” ์›๋ฆฌ ๋•Œ๋ฌธ์— ๋ ๋ถ€๋ถ„์— index๊ฐ€ ์—†๋Š” ๊ณณ๊ณผ ๋น„๊ตํ•ด์„œ undifined์™€ ๋ฌด์˜๋ฏธํ•œ ๋น„๊ต๋ฅผ ํ•˜๊ณ , ์ด๋ฏธ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ์—์„œ๋„ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ํ•˜ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, j < arr.length ์กฐ๊ฑด ๋•Œ๋ฌธ์— arr[j + 1]๊ฐ€ ๋ฐฐ์—ด ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ undefined๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™”๋œ ์ฝ”๋“œ

function bubbleSort(arr) {
  let noSwaps;
  for (let i = arr.length; i > 0; i--) {
    noSwaps = true;
    for (let j = 0; j < i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        noSwaps = false;
      }
    }
    if (noSwaps) break;
  }
  return arr;
}

j < arr.length - i - 1๋กœ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ undefined๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ์ด๋ฏธ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ์—์„œ๋„ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์ง„ํ–‰๋˜๋ฉด์„œ ๊ตํ™˜ ์ž‘์—…์ด ์—†๋‹ค๋ฉด ๋ฐฐ์—ด์€ ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, ๋ฐฐ์—ด์ด ๊ฑฐ์˜ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋ฉด ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง์— ๋”ฐ๋ผ ์ „ ์ฝ”๋“œ์™€๋Š” ์•„์ฃผ ํฐ ์ฐจ์ด๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๋ฒ„๋ธ” ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„(Big O)

๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค n๋ฒˆ์˜ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ๋ฐฐ์—ด์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„๋ธ” ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ž…๋‹ˆ๋‹ค.

 

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

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ๋ฒ„๋ธ”์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์œผ๋กœ ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ ์€ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ์‚ฌํ•ญ๋“ค์€ '์ตœ์„ '์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ ๋ฒ„๋ธ”์ •๋ ฌ์€ ์—ฌ์ „ํžˆ O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!