티스토리 뷰
[문제 링크]
https://www.hackerrank.com/challenges/quicksort1/problem?isFullScreen=true
Quicksort 1 - Partition | HackerRank
Perform the first step of Quicksort: partitioning an array.
www.hackerrank.com
public class QuickSort1Partition {
public static void main(String[] args) {
List<Integer> arr = Arrays.asList(4, 5, 3, 7, 2);
List<Integer>answer = quickSort(arr);
output(answer);
}
public static List<Integer> quickSort(List<Integer> arr) {
//입력된 리스트가 1보다 작으면 그 리스트를 그대로 반환
if (arr.size() < 2) {
return arr;
}
int pivot = arr.get(0);
List<Integer> left = new ArrayList<>();
List<Integer> right = new ArrayList<>();
List<Integer> equal = Arrays.asList(pivot);
for (Integer integer : arr) {
if (pivot > integer) {
left.add(integer);
} else if (integer > pivot) {
right.add(integer);
}
}
//나누어진 서브리스트를 재귀 정렬
List<Integer> sortedLeft = quickSort(left);
List<Integer> sortedRight = quickSort(right);
List<Integer> answer = new ArrayList<>();
answer.addAll(sortedLeft);
answer.addAll(equal);
answer.addAll(sortedRight);
return answer;
}
public static void output(List<Integer> arr) {
for (Integer integer : arr) {
System.out.print(integer + " ");
}
System.out.println();
}
}
퀵 정렬을 구현하는 문제.
퀵 정렬의 시간복잡도는 보통 nlogn으로 (비교하고자 하는 원소의 최대 수는 n-1이고, 분할단계의 수가 n을 2로 나누니까 logn. 상수항을 빼고 계산하니 nlogn) 빠른 성능을 가지는 정렬 알고리즘이다.
퀵 정렬은 분할 정복(divide and conquer) 방법을 사용하여 정렬을 수행한다.
분할 정복 방법
문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략이다.
먼저 리스트에서 피벗(pivot)을 선택한 후, 피벗을 기준으로 리스트를 두 개의 서브리스트로 분할한다.
피벗을 기준으로 분할한 후, 피벗을 제외한 왼쪽 서브리스트는 모두 피벗보다 작거나 같은 원소로 이루어지고, 오른쪽 서브리스트는 모두 피벗보다 큰 원소로 이루어진다.
이후, 분할된 두 서브리스트에 대해 동일한 방법을 재귀적으로 적용하면서 정렬을 계속한다.
이렇게 서브리스트의 크기가 0이나 1이 될 때까지 분할하고, 이를 다시 병합하여 정렬된 전체 리스트를 얻게 된다.
'알고리즘 문제' 카테고리의 다른 글
[hackerrank] counting sort 1 계수정렬 누적합 배열 만들기 (0) | 2023.04.15 |
---|---|
[프로그래머스] 베스트앨범 (1) | 2023.04.14 |
[hackerrank] CorrectnessAndTheLoopInvariant (삽입정렬) (0) | 2023.04.13 |
[프로그래머스]전화번호 목록 - JAVA (0) | 2023.04.13 |
[프로그래머스] 위장 - JAVA (0) | 2023.04.13 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프로그래머스
- 동적크롤링
- pessimisticlock
- 부하테스트시나리오
- jwt
- bankersRounding
- jmeter시나리오
- Redis
- Redisson
- jmeter부하테스트
- Spring
- index
- hackerrank
- Lock
- Python
- jmeter로그인
- 자바
- EC2
- CorrectnessAndTheLoopInvariant
- 스프링faker
- 항해
- CheckedException
- jmeter세션
- jmeter테스트
- jmeter토큰
- Java
- 인덱스
- jmeter쿠키
- 대규모더미데이터
- 토큰
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함