퀵 정렬 알고리즘
2019. 10. 8. 17:41ㆍ알고리즘/암기
오름차순 정렬을 가정했을 때, 피봇이라는 기준값으로 왼쪽에는 기준값보다 작은 부분집합을 형성시키고 오른쪽에는 기준값보다 큰 부분집합을 형성시킨다. 분할정복을 이용하기 때문에 lgN의 깊이만큼 재귀호출을 하고, 깊이마다 배열의 길이인 N만큼 비교하기 때문에 총 평균 시간복잡도는 NlgN만에 정렬시킬 수 있다
피봇을 잡는 기준은 다양하며 특정 피봇 위치를 잡았을 때 엄청 좋다라는 것은 없다. 다만 합병 정렬과 달리, 피봇에 따라 비균등하게 부분집합들이 나눠질 수 있기 때문에 unstable-sort로 분류를 한다. 만일 정렬된 배열에 대해서 퀵 소트를 한다고 하면, 퀵 정렬 알고리즘에 따라서 lgN의 깊이가 아닌 N의 깊이만큼 내려가게 된다. 따라서 최악의 시간복잡도 O(N^2)이 나오게 된다
1) 리스트 맨 끝 값으로 피봇을 잡았을 때
- 두 인덱스 변수를 이용해서, 피봇값보다 작다면 두 인덱스에 해당하는 값들은 switching한다
2) 리스트 맨 앞 값으로 피봇을 잡았을 때
- 1번과 유사하지만 끝에서부터 탐색한다는 차이점이 있다
17번의 부등호 방향만 바꿔준다면 오름차순을 내림차순으로 바꿀 수 있다
'알고리즘 > 암기' 카테고리의 다른 글
선택 정렬 알고리즘 (0) | 2019.10.10 |
---|---|
내림차순 정렬된 배열을 뒤집기 (0) | 2019.10.09 |
문자열 탐색 KMP (0) | 2019.09.25 |
map을 정렬하는 방법 (0) | 2019.09.22 |
sort 함수에서의 compare function 동작 로직 (0) | 2019.09.21 |