diff --git a/CS/Sort/do02reen24/bubbleSort.js b/CS/Sort/do02reen24/bubbleSort.js new file mode 100644 index 0000000..765838c --- /dev/null +++ b/CS/Sort/do02reen24/bubbleSort.js @@ -0,0 +1,12 @@ +function bubbleSort(arr) { + for (let i = 0; i < arr.length - 1; i++) { + for (let j = 0; j < arr.length - 1 - i; j++) { + if (arr[j] > arr[j + 1]) { + let temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } + return arr; +} diff --git a/CS/Sort/do02reen24/heapSort.js b/CS/Sort/do02reen24/heapSort.js new file mode 100644 index 0000000..450f14c --- /dev/null +++ b/CS/Sort/do02reen24/heapSort.js @@ -0,0 +1,37 @@ +function swap(array, left, right) { + const temp = array[left]; + array[left] = array[right]; + array[right] = temp; +} + +function heapify(heap) { + for (let i = 1; i < heap.length; i++) { + let child = i; + do { + let parent = Math.floor((child - 1) / 2); + if (heap[parent] < heap[child]) { + swap(heap, parent, child); + } + child = parent; + } while (child !== 0); + } +} + +function heapSort(heap) { + heapify(heap); // make max heap + + for (let i = heap.length - 1; i > 0; i--) { + swap(heap, 0, i); + let parent = 0; + let child = 1; + do { + child = 2 * parent + 1; + if (heap[child] < heap[child + 1] && child < i - 1) child++; + if (heap[parent] < heap[child] && child < i) swap(heap, parent, child); + parent = child; + } while (child < i); + } + return heap; +} + +console.log(heapSort([4, 1, 5, 6, 2, 8])); diff --git a/CS/Sort/do02reen24/insertSort.js b/CS/Sort/do02reen24/insertSort.js new file mode 100644 index 0000000..dc05998 --- /dev/null +++ b/CS/Sort/do02reen24/insertSort.js @@ -0,0 +1,12 @@ +function insertSort(arr) { + for (let i = 1; i < arr.length; i++) { + let index = i; + while (arr[index - 1] > arr[index] && index > 0) { + let temp = arr[index]; + arr[index] = arr[index - 1]; + arr[index - 1] = temp; + index--; + } + } + return arr; +} diff --git a/CS/Sort/do02reen24/mergeSort.js b/CS/Sort/do02reen24/mergeSort.js new file mode 100644 index 0000000..2cee1dc --- /dev/null +++ b/CS/Sort/do02reen24/mergeSort.js @@ -0,0 +1,17 @@ +function merge(left, right) { + const result = []; + while (left.length && right.length) { + if (left[0] <= right[0]) result.push(left.shift()); + else result.push(right.shift()); + } + return [...result, ...left, ...right]; +} + +function mergeSort(arr) { + if (arr.length < 2) return arr; + + const mid = Math.floor(arr.length / 2); + const left = arr.slice(0, mid); + const right = arr.slice(mid, arr.length); + return merge(mergeSort(left), mergeSort(right)); +} diff --git a/CS/Sort/do02reen24/quickSort.js b/CS/Sort/do02reen24/quickSort.js new file mode 100644 index 0000000..ca686d8 --- /dev/null +++ b/CS/Sort/do02reen24/quickSort.js @@ -0,0 +1,30 @@ +function swap(array, left, right) { + const temp = array[left]; + array[left] = array[right]; + array[right] = temp; +} + +function divide(array, start, end) { + const pivotValue = array[Math.floor((start + end) / 2)]; + + while (start <= end) { + while (array[start] < pivotValue) start = start + 1; + while (array[end] > pivotValue) end = end - 1; + + if (start <= end) { + swap(array, start, end); + start = start + 1; + end = end - 1; + } + } + + return start; +} + +function quickSort(array, start = 0, end = array.length - 1) { + if (start >= end) return; + let index = divide(array, start, end); + quickSort(array, start, index - 1); + quickSort(array, index + 1, end); + return array; +} diff --git a/CS/Sort/do02reen24/selectSort.js b/CS/Sort/do02reen24/selectSort.js new file mode 100644 index 0000000..059973a --- /dev/null +++ b/CS/Sort/do02reen24/selectSort.js @@ -0,0 +1,12 @@ +function selectSort(arr) { + for (let i = 0; i < arr.length - 1; i++) { + let index = i; + for (let j = i + 1; j < arr.length; j++) { + if (arr[index] > arr[j]) index = j; + } + let temp = arr[i]; + arr[i] = arr[index]; + arr[index] = temp; + } + return arr; +} diff --git a/CS/Sort/do02reen24/sort.md b/CS/Sort/do02reen24/sort.md new file mode 100644 index 0000000..667adf0 --- /dev/null +++ b/CS/Sort/do02reen24/sort.md @@ -0,0 +1,29 @@ +# ๐Ÿ“š Sort + +## โฐ ์‹œ๊ฐ„๋ณต์žก๋„ + +| Name | ์ตœ์„  | ํ‰๊ท  | ์ตœ์•… | ๋ฉ”๋ชจ๋ฆฌ | +| :------: | :------: | :------: | :------: | :-----: | +| ๋ฒ„๋ธ”์ •๋ ฌ | O(n) | O(n^2) | O(n^2) | O(1) | +| ์„ ํƒ์ •๋ ฌ | O(n^2) | O(n^2) | O(n^2) | O(1) | +| ์‚ฝ์ž…์ •๋ ฌ | O(n) | O(n^2) | O(n^2) | O(1) | +| ํž™์ •๋ ฌ | O(n) | O(nlogn) | O(nlogn) | O(1) | +| ๋ณ‘ํ•ฉ์ •๋ ฌ | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | +| ํ€ต์ •๋ ฌ | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | + +## ๐Ÿ”Ž ํ€ต์ •๋ ฌ + +### ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ์˜ ๊ณตํ†ต์  + +- Divide and Conquer(๋ถ„ํ• -์ •๋ณต) ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์†ํ•จ +- ๋‘˜ ๋‹ค ์ ์  ํƒ์ƒ‰ํ•  ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ชผ๊ฐœ์„œ ์žฌ๊ท€ํ•จ์ˆ˜์— ๋„˜๊ฒจ์คŒ + +### ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ์˜ ์ฐจ์ด์  + +- ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ๋‹ฌ๋ฆฌ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ +- ๋ณ‘ํ•ฉ์ •๋ ฌ์„ `stable` ํ•˜์ง€๋งŒ, ํ€ต ์ •๋ ฌ์„ `unstable`ํ•จ. (์›์†Œ๋“ค ์ค‘ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ดˆ๊ธฐ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ) + +### ๋ถ„ํ•  ๋ฐฉ๋ฒ• + +1. Lomutos' Partition (๋ฐฐ์—ด์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ pivot์œผ๋กœ ์ •ํ•˜๋Š” ๋ฐฉ์‹) +2. Hoare's Parition (๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’์„ pivot์œผ๋กœ ์ •ํ•˜๋Š” ๋ฐฉ์‹)