해시 개념에 이어 오늘은 자료구조, 알고리즘 내 검색과 정렬에 대해서 공부해보고자 한다.
검색은 자료 내에 특정 값을 찾는 행위를 의미하며, 배열이 정렬되었는지에 따라서 두 가지 기법을 사용할 수 있다.
정렬이란 원소들을 일정한 순서대로 열거하는 알고리즘이라고 할 수 있다. 그 결과는 반드시 다음 두 조건을 충족해야 한다.
- 삽입 정렬(Insertion sort)
- 선택 정렬(Selection sort)
- 버블 정렬(Bubble sort)
- 병합 정렬(Merge sort)
- 퀵 정렬(Quick sort)
- 힙 정렬(Heap sort)
function insertionSort (array) {
for(let i=1; i<array.length; i++){
let value = array[i]
let prev = i - 1
while(prev >= 0 && array[prev] > value){
array[prev+1] = array[prev]
prev--
}
array[prev+1] = value;
}
return array
}
function selectionSort (array) {
let indexMin;
for(let i=0; i<array.length-1; i++){
indexMin = i;
for(let j=i+1; j<array.length; j++){
if(array[j] < array[indexMin]){
indexMin = j
}
}
[array[i], array[indexMin]] = [array[indexMin], array[i]];
}
return array
}
function bubbleSort (array) {
for(let i=0; i<array.length; i++){
for(let j=1; j<array.length - i; j++){
if(array[j-1] > array[j]){
[array[j-1], array[j]] = [array[j], array[j-1]];
}
}
}
return array;
}
// 이미 정렬되어 있는 왼쪽, 오른쪽 배열을 받아서 하나로 합치는 함수
const merge = (left, right) => {
const result = [];
while(left.length !== 0 && right.length !== 0) {
left[0] <= right[0] ? result.push(left.shift()) : result.push(right.shift())
}
return [...result, ...left, ...right]
}
const mergeSort = (array) => {
if(array.length < 2) return array;
let pivot = Math.floor(array.length/2)
let left = array.slice(0, pivot)
let right = array.slice(pivot, array.length)
return merge(mergeSort(left), mergeSort(right))
}
const quickSort = (array) => {
// array의 요소가 하나이면 array 자체를 그대로 반환
if(array.length <= 1){
return array
}
// quickSort 초기 배열을 선언, 첫 pivot 배열의 첫 번째 요소
const pivot = [array[0]]
const left = []
const right = []
// for loop을 실행하며 pivot보다 작은 것은 왼쪽으로, 큰 것은 오른쪽으로, 그렇지 않은 것은 pivot에 넣어 준다.
for(let i=1; i<array.length; i++){
if(array[i] < pivot){
left.push(array[i])
} else if(array[i] > pivot){
right.push(array[i])
} else {
pivot.push(array[i])
}
}
// quickSort 진행 상황을 단계별로 보여주기 위한 코드
console.log(`left: ${left}, pivot: ${pivot}, right: ${right}`)
// 재귀함수 구조로 다시 선언하여 끝날 때까지 실행
return quickSort(left).concat(pivot, quickSort(right));
}
heap에 대한 개념이 수반되어야 하기에, 힙 정렬에 관해서는 더 내 것으로 만들기 위한 추가 공부가 필요하다고 생각하여, 추가 공부 후 수정하여 추가해놓고자 한다.
function solution(array, commands) {
let answer = [];
for(let i=0; i<commands.length; i++){
let result = array.slice(commands[i][0]-1, commands[i][1]).sort((a,b)=>a-b)
answer.push(result[commands[i][2]-1])
}
return answer
}