버블정렬 (bubble sort, sinking sort)은 두 인접한 원소를 검사하여 정렬하는 방법이다.
시간복잡도가 O(n^2)로 상당히 느리지만 코드가 단순하기 때문에 자주 사용된다.
원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다.
코드를 짜기는 쉽지만, 성능면에서는 좋지 않다!
var bubbleSort = function(array) {
var length = array.length;
var i, j, temp;
for (i = 0; i < length - 1; i++) { // 순차적으로 비교하기 위한 반복문
for (j = 0; j < length - 1 - i; j++) { // 끝까지 돌았을 때 다시 처음부터 비교하기 위한 반복문
if (array[j] > array[j + 1]) { // 두 수를 비교하여 앞 수가 뒷 수보다 크면
temp = array[j]; // 두 수를 서로 바꿔준다
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
};
bubbleSort([5,1,7,4,6,3,2,8]); // 1,2,3,4,5,6,7,8
function insertionSort (array) {
for (let i = 1; i < array.length; i++) {
let cur = array[i];
let left = i - 1;
while (left >= 0 && array[left] > cur) {
array[left + 1] = array[left];
array[left] = cur;
cur = array[left];
left--;
}
}
return array;
}
1번째 데이터를 뽑아서 바로 앞의 0번째 데이터와 비교한 후, 0번째 데이터가 더 크면 두 값을 교환한다.
그 다음 2번째 데이터를 뽑아서 1번째 데이터와 비교한다. 1번째 데이터가 더 크면 두 값을 다시 교환.
버블정렬이 각 회전이 끝날때마다 맨 마지막 데이터의 위치가 정해졌던 것과 반대로,
선택정렬은 n번째 회전이 끝날때마다 앞에서 n번째 데이터의 위치가 정해진다.
선택정렬 순서
1. 먼저 주어진 리스트 중에 최소값을 찾는다.
시간복잡도
- 정렬이 안 되어있는 경우 : O(n^2)
- 이미 정렬 되어있는 경우 : O(n^2)
- 매번 정해진 자리에 올 수 있는 최소값을 찾아야하기 때문에 최선,최악 시간복잡도가 같음
장점
메모리절약, 알고리즘이 직관적이며 구현하기 쉽다.
단점
최선, 최악의 경우 모두 O(n^2)의 시간이 걸리는 만큼 성능이 매우 떨어진다.
function selectionSort (array) {
for (let i = 0; i < array.length; i++) {
let minIndex = i;
for (let j = i + 1; j < array.length; j++) {
if (array[minIndex] > array[j]) {
minIndex = j;
}
}
if (minIndex !== i) {
let swap = array[minIndex];
array[minIndex] = array[i];
array[i] = swap;
}
console.log(`${i}회전: ${array}`);
}
return array;
}
console.log(selectionSort([5, 4, 3, 2, 1]));