Skip to content

Latest commit

ย 

History

History
312 lines (214 loc) ยท 7.53 KB

sorting.md

File metadata and controls

312 lines (214 loc) ยท 7.53 KB

Sorting

[์ž‘์„ฑ์ž: ๋…ธํฌ์žฌ]



๐Ÿ’กย  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ,

๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์ด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์•ผ๋งŒ ํ•ด๊ฒฐ์ด ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ์ค‘ ์‰ฌ์šดํŽธ์— ์†ํ•˜๋Š” ์„ธ๊ฐ€์ง€๋ฅผ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ฒ„๋ธ” ์ •๋ ฌ (Bubble Sort)

๋ฒ„๋ธ” ์ •๋ ฌ์€ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n^2) ์œผ๋กœ ์ƒ๋‹นํžˆ ๋Š๋ฆฌ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์„ ๋•Œ์— ์“ฐ์ž…๋‹ˆ๋‹ค.

์›์†Œ์˜ ์ด๋™์ด ๊ฑฐํ’ˆ์ด ์ˆ˜๋ฉด์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” ๋“ฏํ•œ ๋ชจ์Šต์„ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—

Bubble Sort ๋ผ๋Š” ์ด๋ฆ„์ด ์ง€์–ด์กŒ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (gif ์ฐธ๊ณ  ๐Ÿ‘‡ย )

1.gif




์ด๋Ÿฐ ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2.png



๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๊ณ ,

5๊ฐ€ 2๋ณด๋‹ค ๋” ํฌ๋ฏ€๋กœ ๋‘ ์›์†Œ์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

3.png




๊ทธ๋ฆฌ๊ณ  ๋ฐ”๊พผ ์œ„์น˜์—์„œ ๊ทธ ์˜† ์›์†Œ์ธ 6๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—” 5๊ฐ€ 6๋ณด๋‹ค ์ž‘๋„ค์š”? ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์—” 6๊ณผ 4๋ฅผ ๋น„๊ตํ•˜๊ณ , ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๊ณ 

6๊ณผ 1์„ ๋น„๊ตํ•˜์—ฌ ์ž๋ฆฌ๋ฅผ ~~......

4.png


์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€ ๊ทธ ๋‹ค์Œ ํฐ ๊ฐ’์ด ์ž๋ฆฌ์— ์˜ฌ ๋•Œ๊นŒ์ง€ for ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.


1-1. ์ฝ”๋“œ ๊ตฌํ˜„


๋‹ค์Œ์€ ๋ฒ„๋ธ” ์ •๋ ฌ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

let arr = [5, 2, 6, 4, 1, 3];

const bubble = (arr, size) => {
    for (let i = size - 1; i > 0; i--) { // ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ๊ฐ€๋Š” for ๋ฌธ
        for (let j = 0; j < i; j++) { // ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋Š” for ๋ฌธ
            if (arr[j] > arr[j + 1]) { // j ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด ๊ทธ ์˜ค๋ฅธ์ชฝ ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด
                let swap = arr[j]; 
                arr[j] = arr[j + 1];
                arr[j + 1] = swap;
            } // ex) j = 5, j+1 = 2 ๋ผ๋ฉด
	}     // swap ๋ณ€์ˆ˜์— 5๋ฅผ ์ €์žฅํ•ด๋‘๊ณ 
    }         // j ์ž๋ฆฌ์— 2๋ฅผ, j+1 ์ž๋ฆฌ์— 5๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค
    return arr;
}

console.log(bubble(arr, arr.length));


// [ 1, 2, 3, 4, 5, 6 ]


1-2. ์‹œ๊ฐ„๋ณต์žก๋„

  • Worst Case: O(n^2): ์ •๋ ฌ์ด ํ•˜๋‚˜๋„ ์•ˆ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ
  • Best Case: O(n): ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ

๋ฒ„๋ธ” ์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
๊ฐ ์ž๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด n๋ฒˆ์˜ ์ˆœํšŒ๋ฅผ ํ•ด์•ผํ•˜๋ฉฐ
n๋ฒˆ์˜ ํšŒ์ „ ๋™์•ˆ์— ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋˜ ์ˆœํšŒ๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ๋กœ ์ •๋ ฌ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(but, ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ
์ด๋ฏธ ์•Œ๋งž๊ฒŒ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†์„ํ…Œ๋‹ˆ ์šฐ๋ฆฌ์—๊ฒŒ Best Case ๋Š” ์—†๊ฒ ์ฃ ?
๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๊ตฌํ˜„ํ•ด๋‘” ์ฝ”๋“œ์— break ๋ฌธ์€ ์—†์Šต๋‹ˆ๋‹ค,,๐Ÿ™ƒย )


2. ์„ ํƒ ์ •๋ ฌ (Selection Sort)

์„ ํƒ ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

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




๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๋‘๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2.png



0๋ฒˆ์งธ ์ž๋ฆฌ์— ์›์†Œ๋ฅผ ๋„ฃ์–ด์ค„ ์ฐจ๋ก€๋ผ๋ฉด,

๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ๋ถ€ํ„ฐ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

5.png



๊ฐ€์žฅ ๊ฐ’์ด ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค!

๊ฐ€์žฅ ์•ž ์ž๋ฆฌ๋กœ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

6.png



1๋ฒˆ์งธ ์ž๋ฆฌ์— ์›์†Œ๋ฅผ ๋„ฃ์–ด์ค„ ์ฐจ๋ก€์ธ๋ฐ,

์ด๋ฏธ ๊ทธ์— ๋งž๋Š” ์›์†Œ๊ฐ€ ์œ„์น˜ํ•ด ์žˆ์œผ๋ฏ€๋กœ

์ด๋ฒˆ์—” Swap ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

7.png


์ด๋Ÿฐ์‹์œผ๋กœ n๋ฒˆ์งธ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ๋ฅผ ์ฐพ์•„๋‚ด๋ฉฐ

์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€” ๋•Œ๊นŒ์ง€ for ๋ฌธ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.


2-1. ์ฝ”๋“œ ๊ตฌํ˜„


๋‹ค์Œ์€ ์„ ํƒ ์ •๋ ฌ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

let arr = [5, 2, 6, 4, 1, 3];

const bubble = (arr, size) => {
    for (let i = size - 1; i > 0; i--) { // ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ๊ฐ€๋Š” for ๋ฌธ
        for (let j = 0; j < i; j++) { // ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋Š” for ๋ฌธ
            if (arr[j] > arr[j + 1]) { // j ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด ๊ทธ ์˜ค๋ฅธ์ชฝ ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด
                let swap = arr[j]; 
                arr[j] = arr[j + 1];
                arr[j + 1] = swap;
            } // ex) j = 5, j+1 = 2 ๋ผ๋ฉด
	}     // swap ๋ณ€์ˆ˜์— 5๋ฅผ ์ €์žฅํ•ด๋‘๊ณ 
    }         // j ์ž๋ฆฌ์— 2๋ฅผ, j+1 ์ž๋ฆฌ์— 5๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค
    return arr;
}

console.log(bubble(arr, arr.length));


// [ 1, 2, 3, 4, 5, 6 ]


2-2. ์‹œ๊ฐ„๋ณต์žก๋„

  • Worst Case: O(n^2): ์ •๋ ฌ์ด ํ•˜๋‚˜๋„ ์•ˆ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ
  • Best Case: O(n^2): ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ

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

๋งค๋ฒˆ ์ •ํ•ด์ง„ ์ž๋ฆฌ์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.


3. ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort)

์‚ฝ์ž… ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ํšจ์œจ์ด ๋–จ์–ด์ง€์ง€๋งŒ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.




์ด๋ฒˆ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๋‘๊ณ  ์‹œ์ž‘ํ•˜์ง€๋งŒ,

์‚ฝ์ž… ์ •๋ ฌ์€ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ 1๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2.png



์™ผ์ชฝ ์ธ๋ฑ์Šค์™€ ๋น„๊ต ํ–ˆ์„ ๋•Œ ๊ฐ’์ด ์ž‘๋‹ค๋ฉด

ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ์™ผ์ชฝ์œผ๋กœ Swap ์‹œํ‚ต๋‹ˆ๋‹ค.

8.png



๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค์—์„  ๊ต์ฒดํ•  ํ•„์š”๊ฐ€ ์—†๋„ค์š”!

์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.

9.png


๊ทธ๋Ÿผ ๊ทธ ๋‹ค์Œ ์ˆœ์„œ์ธ 3๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์œ„์น˜ํ•œ ๊ฐ’์ธ โ€˜4โ€™ ๋Š”

6๊ณผ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๊ณ  ์—ฐ์†์œผ๋กœ 5์™€ ์ž๋ฆฌ๋ฅผ ๋˜ ๋ฐ”๊พธ๊ฒ ์ฃ ?

์ด๋Ÿฐ์‹์œผ๋กœ ์™ผ์ชฝ์— ํ˜„์žฌ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€

for ๋ฌธ๊ณผ while ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ Swap ์‹œ์ผœ์ค๋‹ˆ๋‹ค.


3-1. ์ฝ”๋“œ ๊ตฌํ˜„


๋‹ค์Œ์€ ์‚ฝ์ž… ์ •๋ ฌ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

let arr = [5, 2, 6, 4, 1, 3];

const insertion = (arr) => {
    for (let i = 1; i < arr.length; i++) { //1๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ˆœํšŒ
        let cur = arr[i]; // ํ˜„์žฌ i ๋ฒˆ์งธ ๊ฐ’
        let left = i - 1; // i ๋ฒˆ์งธ์˜ ์™ผ์ชฝ ๊ฐ’

        while (left >= 0 && arr[left] > cur) { // left ๊ฐ’์ด ํด ๋•Œ ๋ฐ˜๋ณต
            arr[left + 1] = arr[left]; // left ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ์™ผ์ชฝ๊ณผ ๋น„๊ต
            left--;
        }
	arr[left + 1] = cur; // ๊ตํ™˜์ด ๋๋‚˜๋ฉด ๋งจ ์•ž ์ธ๋ฑ์Šค์— cur ๊ฐ’์„ ๋„ฃ์–ด์คŒ
    }
    return arr;
}

console.log(insertion(arr));

// [ 1, 2, 3, 4, 5, 6 ]


3-2. ์‹œ๊ฐ„๋ณต์žก๋„

  • Worst Case: O(n^2): ์ •๋ ฌ์ด ํ•˜๋‚˜๋„ ์•ˆ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ
  • Best Case: O(n): ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ

์‚ฝ์ž… ์ •๋ ฌ์€ ๋ฒ„๋ธ” ์ •๋ ฌ๊ณผ ๋˜‘๊ฐ™์€ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์Šค์บ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.


???? ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋‹ค ๊ฑฐ๊ธฐ์„œ ๊ฑฐ๊ธด๋ฐ ๋ญ๊ฐ€ ๋น ๋ฅด๋‹จ๊ฑฐ์ฃ ?

์‚ฌ์‹ค ์ตœ์•…, ์ตœ๊ณ ์˜ ๊ฒฝ์šฐ๋Š” ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

์‹œ๊ฐ„๋ณต์žก๋„๋Š” Worst ์™€ Best ๋ณด๋‹จ Average ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ข€ ๋” ์˜ณ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋ก  ๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ,

์‚ฝ์ž… > ์„ ํƒ > ๋ฒ„๋ธ” ์ˆœ์œผ๋กœ ๋‚ซ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!