- bubbleSort
정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다.
버블 정렬(bubble sort)
은 여러 정렬 알고리즘(삽입 정렬, 퀵 정렬, 병합 정렬, 기수 정렬 등) 중 가장 기본적인 알고리즘입니다.
버블 정렬 알고리즘은 아래와 같습니다.
bubble sort
라고 부릅니다.const bubbleSort = function (arr) {
return arr.sort((a,b) => a-b)
};
이렇게 하고 싶었다.. ㅎ
어쨌든 시작해보자
일단 전체를 순환하는 반복문이 하나 필요할 거고,
그 안에서 반복문을 추가해 점점 비교하는 조건문을 추가해보려고 해봤다.
const bubbleSort = function (arr) {
for (let i = 0; i<=arr.length; i++) {
for (let j = 0; j<=arr.length; j++) {
if (arr[j] > arr[j+1]) {
let temp = arr[j+1]
arr[j+1] = arr[j]
arr[j] = temp
}
}
}
return arr
};
이랬더니 실행시간초과가 떴고, 너무 많은 순환을 해줘야하기 때문인듯...
그래서 바꿀 배열과 원래 배열이 변한게 없다면(JSON.stringify이용/ (newArr.toString() === arr.toString())
도 가능), break를 걸어주는 조건을 안 쪽 반복문에 추가해주었다.
아 그리고 i, j 범위도 배열이기때문에 등호 빼주고, 또 마지막까진 비교하지 않기때문에 -1도 해주어야함! 너무 대충 생각해버린 모양
const bubbleSort = function (arr) {
let newArr = arr.slice(0)
for (let i = 0; i<newArr.length-1; i++) {
for (let j = 0; j<newArr.length-1; j++) {
if (newArr[j] > newArr[j+1]) {
let temp = newArr[j+1]
newArr[j+1] = newArr[j]
newArr[j] = temp
}
}
if(JSON.stringify(newArr) === JSON.stringify(arr)) {
break
}
}
return newArr;
};
let bubbleSort = function (arr) {
let N = arr.length;
for (let i = 0; i < N; i++) {
// swap 횟수를 기록한다.
// 어떤 요소도 swap되지 않은 경우, 배열은 정렬된 상태이다.
let swaps = 0;
// 매 반복(iteration)마다 i번째로 큰 수가 마지막에서 i번째 위치하게 된다.
// 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다.
for (let j = 0; j < N - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swaps++;
swap(j, j + 1, arr);
}
}
if (swaps === 0) {
break;
}
}
return arr;
};
레퍼런스는 횟수를 기록해서 횟수가 0이라면 break해주는 식으로 했다.
그리고 또, 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다는 부분이! 있어서, 아하! 하고
j < newArr.length - i - 1
나도 요렇게 바꿈 ㅎㅎ 하나라도 일을 줄이자
JSON.stringify 좋은 방법인거 같아요 배우고 갑니당!