배열의 중앙값을 반환하는 함수
선택 정렬 알고리즘 응용
배열 array[l…r]의 중앙값을 반환하는 함수를 간단히 구현하였다.
작성한 코드
선택 정렬 알고리즘을 바탕으로 하였다.
단, 정렬이 목적이 아니라 중앙값을 찾는 것이 목적이므로
정렬은 중앙값의 인덱스까지만 수행하면 된다.
// 배열 생성
const array = [];
for (let i = 0; i < 10; i++) { // 10개의 난수 생성
array[i] = Math.floor(Math.random() * 100 + 1); // 난수 범위: 1~100
}
console.log('array:', array);
// 배열의 두 요소 값을 교환하는 함수
const swap = function (array, x, y) {
const temp = array[x];
array[x] = array[y];
array[y] = temp;
};
// 배열 array[l...r]의 중앙값을 반환하는 함수
const arrayMid = function (array, l, r) {
const mid = Math.floor((r-l) / 2); // 중앙값이 위치할 인덱스
let i; let j; let min;
// 선택 정렬
for (i = l; i <= l + mid; i++) { // l + mid 까지만 정렬한다.
min = i;
for (j = i + 1; j <= r; j++) { // 최소값을 탐색한다.
if (array[j] < array[min]) min = j;
}
if (i !== min) swap(array, i, min); // 최소값을 i의 자리에 삽입한다.
}
return array[l + mid]; // 중앙값을 반환한다.
};
// 배열(array[4...8])의 중앙값 출력
const midValue = arrayMid(array, 4, 8);
console.log('array[4...8]의 중앙값:', midValue);
출력 결과
장점
- 중앙값의 인덱스까지만 정렬하므로
알고리즘의 수행시간을 조금 더 줄일 수 있다. - 전체 배열의 중앙값은 물론이고,
배열의 부분 범위의 중앙값도 쉽게 구할 수 있다.
(인덱스를 통해 부분 범위를 지정해주면 된다)
단점
선택정렬을 바탕으로 하였기 때문에,
시간복잡도가 여전히 O(n^^2)으로 효율적인 알고리즘은 아니다.
(다른 정렬 알고리즘 또는 sort 메소드를 사용하면 더 좋을 듯 하다)