Do it! 알고리즘 코딩 테스트 - 파이썬 편 (김종관) 책을 이용하여 알고리즘 공부 중입니다 😃
https://www.youtube.com/watch?v=a3xZAVAPA-s&list=PLFgS-xIWwNVX-zm4m6suWC9d7Ua9z7fuT&index=17
정렬 알고리즘 | 정의 |
버블 bubble | 데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는 방식 |
선택 selection | 대상에서 가장 크거나 작은 데이터를 찾아가 선택을 반복하면서 정렬하는 방식 |
삽입 insertion | 대상을 선택해 정렬돈 영역에서 선택 데이터의 적절한 위치를 찾아 삽입하면서 정렬하는 방식 |
퀵 quick | pivot 값을 선정해 해당 값을 기준으로 정렬하는 방식 |
병합 merge | 이미 정렬된 부분 집합들을 효율적으로 병합해 전체를 정렬하는 방식 |
기수 radix | 데이터의 자릿수를 바탕으로 비교해 데이터를 정렬하는 방식 |
퀵 정렬
pivot을 중심으로 계속 데이터를 2개의 집합으로 나누면서 정렬하는 것이 핵심
시간복잡도 평균적으로 O(nlogn) 최악의 경우 O(n^2)
- 데이터를 분할하는 pivot을 설정한다.
- pivot을 기준으로 다음 과정을 거쳐 데이터를 2개의 집합으로 분리한다.
- start가 가리키는 데이터가 pivot이 가리키는 데이터보다 작으면 start를 오른쪽으로 1칸 이동한다.
- end가 가리키는 데이터가 pivot이 가리키는 데이터보다 크면 end를 왼쪽으로 1칸 이동한다.
- start가 가리키는 데이터가 pivot이 가리키는 데이터보다 크고, end가 가리키는 데이터가 pivot이 가리키는 데이터보다 작으면 start, end가 가리키는 데이터를 swap하고 start는 오른쪽, end는 왼쪽으로 1칸씩 이동한다.
- start와 end가 만날 때까지 2-1 ~ 2-3을 반복한다.
- start와 end가 만나면 만난 지점에서 가리키는 데이터와 pivot이 가리키는 데이터를 비교한다. pivot이 가리키는 데이터가 크면
- 만난 지점의 오른쪽에, 작으면 만난 지점의 왼쪽에 pivot이 가리키는 데이터를 삽입한다.
- 삽입된 pivot을 기준으로 나누어진 분리 집합에서 각각 pivot을 선정한다.
- 분리 집합이 1개 이하가 될 때까지 1 ~ 3 과정을 반복한다.
쉽게 말하면..
기준 데이터(pivot)를 정하고, 투 포인터를 활용한다. 기준 데이터의 왼쪽엔 기준 데이터보다 작은 값을, 오른쪽엔 기준 데이터보다 큰 값을 모은다.
시작 지점 데이터
- 기준 데이터보다 작으면 적절한 위치에 있으므로 시작 인덱스++을 한다.
- 기준 데이터보다 크면 오른쪽 집합으로 옮겨줘야 하므로 인덱스를 멈춘다.
끝 지점 데이터
- 기준 데이터보다 크면 적절한 위치에 있으므로 끝 인덱스--를 한다.
- 기준 데이터보다 작으면 왼쪽 집합으로 옮겨줘야 하므로 인덱스를 멈춘다.
시작 인덱스와 끝 인덱스가 모두 멈춰있는 상태면 둘의 위치를 바꾼다. 그 후 시작 인덱스++ 끝 인덱스--를 한다.
시작 인덱스와 끝 인덱스의 위치가 같다면, 해당 데이터와 기준 데이터를 비교하여 기준 데이터가 크면 인덱스의 오른쪽에, 작으면 인덱스의 왼쪽에 삽입한다.
이 과정을 거치면 루프가 한 번 진행된 것이다. 인덱스 위치를 기점으로 왼쪽과 오른쪽 집합에 대해 각각 위의 과정을 반복한다.
모든 부분 집합의 개수가 1일때까지 루프를 반복한다.
'Code > Algorithm' 카테고리의 다른 글
[정렬] 기수 정렬 (0) | 2023.10.01 |
---|---|
[정렬] 병합 정렬 (0) | 2023.09.30 |
[정렬] 삽입 정렬 (0) | 2023.09.28 |
[정렬] 선택 정렬 (0) | 2023.09.28 |
[정렬] 버블 정렬 (0) | 2023.09.28 |