이들 알고리즘은 데이터의 순서를 변경하거나 선택하여 직접 정렬하는 방식을 사용한다.
하위의 알고리즘의 구현하기 쉬운게 장점이지만, 성능은 O(n^2)로 좋지 못하다.
데이터를 옆 데이터와 비교하면서 자리를 바꾸는 형식이 거품이 일어나는 것 같다고 해서 버블 정렬이라는 이름이 붙었다.
for(let i = 0; i < arr.length - 1; i++){
for(let j = 0; j < (arr.length - i - 1); j++){
if(arr[j] > arr[j + 1]){
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
주어진 데이터에서 가장 작은 (또는 큰) 값을 선택하여 알맞은 위치에 배치하는 방식으로 동작하는 정렬 알고리즘이다.
function SelectionSort(arr){
for(let i = 0; i < arr.length - 1; i++){
let minValueIndex = i;
for(let j = i + 1; j < arr.length; j++){
if(arr[j] < arr[minValueIndex]){
minValueIndex = j;
}
}
let temp = arr[i];
arr[i] = arr[minValueIndex];
arr[minValueIndex] = temp;
}
}
주어진 데이터를 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 부분의 원소를 하나씩 정렬된 부분의 알맞은 위치에 삽입하는 방식으로 동작하는 정렬 알고리즘이다.
function InsertionSort(arr){
for(let i = 1; i < arr.length; i++){
let insertingData = arr[i];
let j;
for(j = i - 1; j >= 0; j--){
if(arr[j] > insertingData){
arr[j + 1] = arr[j];
}else{
break;
}
}
arr[j + 1] = insertingData;
}
}
이 알고리즘은 '분할 정복' 전략을 사용하여 문제를 더 작은 부분으로 나눈 다음, 각 부분 문제를 해결하고 결합하여 전체 문제를 해결한다.
위의 정렬 방식보다 구현은 복잡하지만 더 좋은 성능을 갖고 있다.
function MergeSort(arr, leftIndex, rightIndex){
if(leftIndex < rightIndex){
let midIndex = parseInt((leftIndex + rightIndex) / 2);
MergeSort(arr, leftIndex, midIndex);
MergeSort(arr, midIndex + 1, rightIndex);
Merge(arr, leftIndex, midIndex, rightIndex);
}
}
function Merge(arr, leftIndex, midIndex, rightIndex){
let leftAreaIndex = leftIndex;
let rightAreaIndex = midIndex + 1;
let tempArr = [];
tempArr.length = rightIndex + 1;
tempArr.fill(0, 0, rightIndex + 1);
let tempArrIndex = leftIndex;
while(leftAreaIndex <= midIndex && rightAreaIndex <= rightIndex){
if(arr[leftAreaIndex] <= arr[rightAreaIndex]){
tempArr[tempArrIndex] = arr[leftAreaIndex++];
}else{
tempArr[tempArrIndex] = arr[rightAreaIndex++];
}
tempArrIndex++;
}
if(leftAreaIndex > midIndex){
for(let i = rightAreaIndex; i <= rightIndex; i++){
tempArr[tempArrIndex++] = arr[i];
}
}else{
for(let i = leftAreaIndex; i <= midIndex; i++){
tempArr[tempArrIndex++] = arr[i];
}
}
for(let i = leftIndex; i <= rightIndex; i++){
arr[i] = tempArr[i];
}
}
function quickSort(arr, left, right){
if(left <= right){
let pivot = divide(arr, left, right);
console.log(right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
}
function divide(arr, left, right){
let pivot = arr[left];
let leftStartIndex = left + 1;
let rightStartIndex = right;
while(leftStartIndex <= rightStartIndex){
while(leftStartIndex <= right && pivot >= arr[leftStartIndex]){
leftStartIndex++;
}
while(rightStartIndex >= (left + 1) && pivot <= arr[rightStartIndex]){
rightStartIndex--;
}
if(leftStartIndex <= rightStartIndex){
swap(arr, leftStartIndex, rightStartIndex);
}
}
swap(arr, left, rightStartIndex);
return rightStartIndex;
}
function swap(arr, index1, index2){
let temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}