오늘은 여러 정렬 알고리즘중 가장 기본적인 알고리즘인 버블 정렬 문제를 풀어보았다.
버블정렬은 아래와 같은 방법으로 배열을 오름차순으로 정렬하는 방법이다.
이러한 모습이 마치 거품이 밀려 올라가는 것과 같은 모습이라 bubble sort라고 부른다.
let output = bubbleSort([2, 1, 3]);
console.log(output); // --> [1, 2, 3]
arr가 [2, 1, 3] number타입의 요소를 가지는 배열이라면 [1, 2, 3]과 같은 결과 값을 출력하는 함수를 구해야 한다.
먼저 arr의 요소들을 반복적으로 비교해서 더 작은 숫자가 맨 앞에 위치하도록 바꿔줘야한다. 이중 for문을 만들어줘서 우선 첫 번째 요소와 그 다음 요소를 비교해 첫 번째 요소가 더 크다면 첫 번째 요소를 임시 변수에 넣어놓고 그 자리에 두 번째 요소를 넣어준다. 그리고 다시 첫 번째 요소를 두 번째 요소 자리에 넣어준다. 이런식으로 arr의 길이만큼 반복해서 넣어준다.
const bubbleSort = function (arr) {
for (let i = 0; i < arr.length; i++) {
let temp;
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
};
위와 같은 코드도 정답이 될 수 있지만 만약 수행 시간을 단축 시켜야 한다면 어떻게 코드를 작성 할 수 있을까.
예를 들어, 첫 번째 요소부터 다음 요소들을 비교하는데 위치를 바꿀 필요가 없다면 이미 정렬이 되어있는 숫자이기 때문이다. 그렇다면 이미 정렬이 되어있는 숫자는 비교하지 않고 넘어가게 코드를 작성 할 수 있을까?
const bubbleSort = function (arr) {
for (let i = 0; i < arr.length; i++) {
let temp;
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (!temp) {
break;
}
}
return arr;
};
여기서 temp에 값이 있다는 의미는 arr[j] > arr[j + 1]이라는 조건이 성립했기 때문이다. 그렇다면 우리는 temp에 값이 없을 때 반복문을 빠져나오게 만들어주면 더 이상 정렬하지 않아도 된다는 의미가 된다.