-
선택정렬(Selection Sort)Data Structure & Algorithm 2021. 1. 22. 20:54반응형
[아이디어]
- 데이터의 정렬되지 않은 첫번째 원소부터 선형탐색으로 가장 작은 값을 찾아 인덱스를 기록합니다.
- 1에서 찾은 인덱스를 사용하여 가장 작은 값과 정렬되지 않은 첫번째 원소를 서로 교환합니다.
- 1 ~ 2를 모든 원소 개수 - 1 만큼 반복합니다.
[특징]
- 평균 시간 복잡도는 O(n²)입니다.
- 동일한 값이 두개 이상일 때 정렬 후 데이터 간 순서가 보장되지 않습니다.
- 제자리 정렬 알고리즘으로 swapping을 위한 임시 저장 메모리 외에 추가적인 메모리를 필요로 하지 않아 공간 복잡도는 O(1)입니다.
[구현]
1. python
def selection_sort(data, reverse_order): for i in range(len(data) - 1): index = i for j in range(i + 1, len(data)): if data[j] < data[index] and not reverse_order: index = j if data[j] > data[index] and reverse_order: index = j if i != index: data[i], data[index] = data[index], data[i] data = [3, 4, 1, 2] print('not-sorted:', ', '.join(map(str, data))) selection_sort(data, False) #reverse_order = False -> 오름차순 정렬 print('sorted:', ', '.join(map(str, data)))
2. java
public class Main { public static void main(String[] args) { int[] data = new int[] {3, 4, 1, 2}; int len = data.length; System.out.print("not-sorted: "); for(int i = 0; i < len; i++) { if(i < len - 1) { System.out.print(data[i] + ", "); } else { System.out.println(data[i]); } } selectionSort(data, false); //reverseOrder = false -> 오름차순 정렬 System.out.print("sorted: "); for(int i = 0; i < len; i++) { if(i < len - 1) { System.out.print(data[i] + ", "); } else { System.out.println(data[i]); } } } public static void selectionSort(int[] data, boolean reverseOrder) { int len = data.length; for(int i = 0; i < len - 1; i++) { int index = i; for(int j = i + 1; j < len; j++) { if (data[j] < data[index] && !reverseOrder) { index = j; } if (data[j] > data[index] && reverseOrder) { index = j; } } if(i != index) { int temp = data[i]; data[i] = data[index]; data[index] = temp; } } } }
위의 구현 코드를 실행하면 다음과 같은 순서로 동작합니다.
1. 리스트에서 아직 정렬되지 않은 첫번째 요소를 기준점으로 잡습니다.
2. 기준 인덱스 + 1 ~ 마지막 인덱스 사이의 값 중에서 기준 인덱스 값인 3보다 작은 값 중 최소값을 찾습니다.
3. 조건에 만족하는 최소값은 1이므로 기준 값 최소값을 swapping 합니다.
4. 이제 첫번째 원소가 정렬되었습니다.
5. 리스트에서 아직 정렬되지 않은 첫번째 요소를 기준점으로 잡습니다.
6. 기준점+1 ~ 마지막 인덱스 사이에서 기준점 보다 작은 최소값을 찾습니다.
7. 조건에 만족하는 값은 2이므로 기준값과 2를 swapping합니다.
8. 이제 두 번째 원소까지 정렬 되었습니다.
9. 리스트에서 아직 정렬되지 않은 첫번째 요소를 기준점으로 잡습니다.
10. 기준점+1 ~ 마지막 인덱스 사이에서 기준점 보다 작은 최소값을 찾습니다.
11. 조건에 만족하는 값인 3이 있으므로 기준값과 swapping 합니다.
12. 이제 세 번째 원소까지 정렬되었습니다.
13. 마지막 요소는 가장 큰 값이 남을 수 밖에 없어 별도로 정렬하지 않습니다.
이제 정렬이 완료되었습니다.
'Data Structure & Algorithm' 카테고리의 다른 글
퀵정렬(Quick Sort) (0) 2021.01.28 삽입정렬(Insertion Sort) (0) 2021.01.24 DFS, BFS with python (0) 2021.01.11 그래프의 탐색 DFS, BFS (0) 2020.10.06 Stack과 Queue (0) 2020.09.28