알고리즘 + 18

윤건호·2022년 10월 14일
0

알고리즘

목록 보기
18/23

선택 정렬

처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는
데이터와 바꾸는 것을 반복합니다.

시간복잡도는 일반적으로 이중 포문을 사용하기 때문에 O(N^2) 으로 볼 수 있다.

시간복잡도만 봐도 알 수 있듯이 그다지 효율적인 정렬 알고리즘은 아닌 것 같다.

간단한 코드를 보자면

idx = i 의 값을 넣고
j 포문이 돌면서 가장 작은 값을 idx = j 이 식으로 넣어준다

function solution(arr) {
let answer = arr;
// 참조를 해주니까 arr의 값이 변하면 answer의 값도 변한다
for (let i = 0; i < arr.length; i++) {
let idx = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[idx]) idx = j;
}
[arr[i], arr[idx]] = [arr[idx], arr[i]];
}
return answer;
}

let arr = [13, 5, 11, 7, 23, 15];
console.log(solution(arr));

버블 정렬

가까이에 있는 두 숫자를 비교해 더 작은 값을 반복적으로 앞으로 보낸다.

정렬 알고리즘 중 구현은 가장 쉽지만 가장 비효율적인 알고리즘이다.

버블 정렬 역시 일반적으로 이중포문을 사용해 구현하기 때문에

시간 복잡도는 O(N^2) 로 표기할 수 있다.

function solution(arr) {
let answer = arr;

for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {

j가 돌면서 비교해나간다.

arr.length - 1 - i 번째 까지 도는 이유는 마지막 인덱스가 채워지면
다음 순회때는 거기까지 할 필요가 없기 때문이다.

if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return answer;
}

let a = [13, 5, 11, 7, 23, 15];
console.log(solution(a));

  1. 13 > 5 랑 비교해서 0번째 13이 더 클 경우 자리 바꿔준다.

  2. 그 다음은 13 이랑 11 비교 , 자리바뀌니까 13이랑 7비교

  3. 그런식으로 쭉쭉 바꿔나가서 마지막 자리 채워주고

  4. 다음 i 인덱스 1증가하니 그 전까지 j포문이 돈다

profile
더 배우고 싶은 프론트엔드 개발자 윤건호입니다.

0개의 댓글