2023. 10. 15. 21:49ㆍ컴퓨터/알고리즘
저번 셔플에 이어 금요일의 주제는 정렬 알고리즘 (버블,선택)이다.
정렬은 우리가 원하는 대로 순차적으로 1..2..3....100까지 되게 하는것이다.
그 목적을 이루기 위해 여러 알고리즘들이 있는데.. 가장 접근하기 쉬운 버블 정렬과 선택 정렬 알고리즘을 알아보자.
먼저 버블정렬은 간단하게 말하면, 앞과 뒤를 교환하는것이다.
여기 무작위로 섞인 카드가 있다고 해 보자.
2,1,5,3,4 이것을 정렬하고 싶다.
그렇다면!! 맨 앞부터 (앞과 그 옆) 두개의 카드를 골라 비교한다. 그래서 첫 번째 카드 2와 근접한 카드 1을 골라서
서로 비교를 한다. 2가 1보다 크니까 서로 위치를 바꾼다. 그러면 1,2가 된다. 그렇다면 이제 두 번째 카드를 고른다.
두 번째 카드는 2이다. (아까 바꿨으니까) 그리고 그와 근접한 오른쪽 카드 5를 비교한다.
2는 5보다 크지 않다. 그대로 둔다. 다음 세 번째 카드 5를 고르고 그 옆에 있는 카드 3을 고른다.
둘이 비교하면 5는 3보다 크니 서로 위치를 교환한다. 12354가 된다.
마지막으로 네 번째 카드 5와 그 옆에 카드 4를 골라 비교한다. 5는 4보다 크니 위치를 교환한다.
즉 12345 정렬이 되었다. 버블 정렬은 이런식으로 진행된다.
이번 예시는 운이 좋아서 한번으로 정렬이 되었는데
이 정렬 과정을 반복해야지 정렬이 되는 경우도 있다.
예 : 5,2,3,1,4
그렇다면 어떻게 정렬을 해야 할까?
이 버블 정렬 알고리즘의 규칙을 살펴보면 큰수가 계속 뒤로 밀려나는것을 알 수 있다.
즉 한번 반복할 때 마다 거기 있는 제일 큰 수는 정확한 위치에 있다는것을 알 수 있다.
그렇다면, 한번 반복할 때 마다 맨 뒷자리를 감소시키면서 반복하면 정렬 알고리즘이 완성된다.
이제 개념을 알았으니 코드로 구현을 해 보자.
배열을 받고~
이중 for문을 돈다.
여기서 i는 맨 끝에 정렬된 위치를 의미한다.
j는 0부터 i까지 비교를 해서 정렬을 한다.
for문에서 i - 1번까지 하는 이유는 마지막 수 + 1을 해버리면 Index Out Exception이 발생하기 때문.. 따라서 -1을 해주면 자연스럽게 + 1을 해도 괜찮.
쨋든 핵심은 비교를 통해 서로의 위치를 교환해서 제일 큰 수를 뒤로 미뤄두고 또 다시 반복해서 미뤄두고 ...이것을 반복하면 정렬이 되는것!
완성했으니 이제 선택 정렬을 알아보자..
선택 정렬은 최소값을 찾아서 맨 앞에 위치시키는것!
다시 무작위의 카드 다섯장이 있고 선택 정렬을 진행한다면 다음과 같이 진행된다.
먼저 배열의 요소들중에 최소값을 찾는다. 그것을 맨 앞에 위치시킨다.
이번 패턴도 맨 앞에 자리는 최소값이라는 보장이 된다. 따라서 그 다음 반복시에는 맨 첫번째를 굳이 확인 안해도 된다.
그래서 맨 앞에 자리를 +1 증가시키고 또다시 최소값을 찾는 형태로 진행이 된다.
이것을 코드로 구현 해 본다면 다음과 같다.
이번에는 i가 증가하는 형태.. 다시 말하지만 첫 번째 부터 최소값이 보장되니까.. 증가하는것!
그래서 i부터 (최소값 부터 배열의 길이까지) 최소값을 탐색한다.
그래서 최소값 인덱스를 구한 뒤, 첫 번째 위치와 인덱스의 위치를 서로 교환한다.
이런식으로 정렬이 진행된다는 사실~~
두 정렬 알고리즘의 시간 복잡도는 동일하다. 하지만 선택 정렬이 조금 더 우수한 성능을 보여준다고 한다.
왜냐하면.. 버블 정렬은 반복마다 무조건 교환을 하게 되어있다.
하지만 선택 정렬은 최소값을 구했을때만 교환을 하기 때문에 교환 횟수가 적다. 그만큼 더 빠를 수 있다는 소리이다.
'컴퓨터 > 알고리즘' 카테고리의 다른 글
알고리즘 공부 1 (0) | 2023.10.26 |
---|---|
퀵 정렬 (Quick Sort) (0) | 2023.10.16 |
Shuffle (0) | 2023.10.13 |