-
기본 정렬(버블정렬, 선택정렬, 삽입정렬)Algorithm/기본문제 2021. 3. 13. 14:10
1. 버블정렬(bubble sort)
- (오름차순 기준)인접한 두 데이터를 비교하여 앞의 데이터가 뒤의 데이터보다 크다면 자리를 바꿈
- 정렬 1턴을 수행할 때마다 해당 턴의 맨 마지막 위치에 정렬이 완료된 데이터가 배치됨
- 각 턴의 마지막은 턴을 수행할 때마다 한 칸씩 앞으로 옴
- 어느 특정 턴에서 swap이 일어나지 않은 경우는 더 이상 정렬할 것이 없다는 의미이므로 이 경우 전체 정렬을 중단함
https://en.wikipedia.org/wiki/Bubble_sort function bubbleSort(data) { for (let i = 0; i < data.length; i++) { let swap = false; for (let j = 0; j < data.length - 1 - i; j++) { if (data[j] > data[j + 1]) { [data[j], data[j + 1]] = [data[j + 1], data[j]] swap = true; } } if (!swap) break; } return data; }
2. 선택정렬(selection sort)
- 정렬 수행시 한 턴에서 데이터들 중 가장 작은 값을 찾고 각 턴에서 선택된 최소값을 턴의 맨 앞 데이터와 교체함
- 각 턴의 맨 앞 데이터는 이미 정렬이 완료된 상태이므로 다음 턴에서는 그 다음 데이터부터 마지막 데이터까지 동일한 작업을 수행
https://en.wikipedia.org/wiki/Selection_sort function selectionSort(data) { for (let i = 0; i < data.length - 1; i++) { let lowest = i; for (let j = i + 1; j < data.length; j++) { if (data[lowest] > data[j]) lowest = j; } [data[lowest], data[i]] = [data[i], data[lowest]]; } return data; }
3. 삽입정렬(insertion sort)
- 두 번째 인덱스부터 시작함
- 해당 인덱스 값(key)의 앞에 있는 데이터(target)부터 비교, key 값이 더 작으면 target 값을 뒤 인덱스로 복사, 이를 target 값보다 key 값이 더 큰 경우까지 반복하여 해당 target 위치 바로 뒤에 key 값을 이동시킴
- 맨 처음 턴에서 첫 번째 값이 target이 되고 두 번째 값이 key값이 됨
- key값은 차례로 앞의 값들끼리 비교하면서 앞부분 값 중 key보다 작은 target값이 있다면 검사를 멈추고 해당 target 다음 위치에 key 값을 배치함
https://commons.wikimedia.org/wiki/File:Insertion-sort-example.gif function insertionSort(data) { for (let i = 1; i < data.length; i++) { let tmp = data[i]; let j = i - 1; while (j >= 0) { if (data[j] > tmp) { data[j + 1] = data[j]; } else { break; } j--; } data[j + 1] = tmp; } return data; }
'Algorithm > 기본문제' 카테고리의 다른 글
고급 정렬(2) - 퀵 정렬(quick sort) (0) 2021.03.13 고급 정렬(1) - 병합정렬(merge sort) (0) 2021.03.13