퀵 소트 cnt++
시간 제한2초메모리 제한1024 MB
중간 인덱스의 피벗을 기준으로 나누고 작은 값과 큰 값에 대해서만 재귀하는 퀵소트가 수행하는 비교 횟수를 구한다.
문제
아래 C++ 코드는 서로 다른 양의 정수 개를 정렬한다.
long long cnt = 0;
vector<int> sort(vector<int> &a) {
vector<int> less, greater;
if (a.size() <= 1) return a;
int pivot = a[(a.size() - 1) / 2];
int n = a.size();
for (int i = 0; i < n; i++) {
cnt += 1;
if (a[i] < pivot) {
less.push_back(a[i]);
} else if (a[i] > pivot) {
greater.push_back(a[i]);
}
}
sort(less); sort(greater);
vector<int> ans;
ans.insert(ans.end(), less.begin(), less.end());
ans.push_back(pivot);
ans.insert(ans.end(), greater.begin(), greater.end());
return ans;
}
서로 다른 자연수 개로 이루어진 배열 A가 주어질 때, 이 배열을 sort 함수로 정렬한 뒤 cnt에 들어 있는 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 이 주어진다 (). 둘째 줄에는 배열 A에 들어 있는 수가 공백으로 구분되어 주어진다. 주어지는 수는 부터 까지의 수로 이루어진 순열이다.
출력
입력으로 주어진 배열을 sort 함수로 정렬했을 때 cnt에 들어 있는 값을 출력한다.