https://www.acmicpc.net/problem/2751
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
퀵 정렬 사용
이 문제의 경우 n^2이면 시간 초과가 나므로 퀵 정렬을 사용할때 최악의 경우를 피해야한다.
가운데 원소를 피벗으로 사용한다.
그리고 입출력 할때 시간을 줄여야 한다.
#include <iostream>
#include <vector>
using namespace std;
void print_vec(vector<int> v, int num);
vector<int> init(vector<int> v, int num);
void Qsort(int s, int e);
vector<int> v;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int num;
std::cin >> num;
v = init(v, num);
Qsort(1, num);
print_vec(v, num);
}
void Qsort(int s, int e) { //퀵정렬
if (s >= e) return;
swap(v[s], v[(s+e)/2]);
int i = s + 1, j = e;
int pivot = s;
while (i <= j) {
if (v[i] > v[pivot] && v[j] < v[pivot])
swap(v[i++], v[j--]);
else if (v[i] > v[pivot])
j--;
else if (v[j] < v[pivot])
i++;
else {
i++; j--;
}
}
swap(v[pivot], v[j]);
Qsort(s, j - 1);
Qsort(j+1, e);
}
void print_vec(vector<int> v, int num) //벡터의 원소 출력
{
for (int i = 1; i <= num; i++)
{
std::cout << v[i] << "\n";
}
}
vector<int> init(vector<int> v, int num) //벡터에 원소 넣기
{
for (int i = 0; i <= num; i++)
{
if (i == 0)
{
v.push_back(2);
}
else
{
int mem;
std::cin >> mem;
v.push_back(mem);
}
}
return v;
}
'코딩테스트 > 백준' 카테고리의 다른 글
백준 1202 : 보석 도둑 (0) | 2021.06.16 |
---|---|
백준 10158 : 개미 (0) | 2021.04.18 |
백준 2293 : 동전 1 (0) | 2020.09.21 |
백준 2580 : 스도쿠 (0) | 2020.09.14 |
백준 2108 : 통계학 (0) | 2020.09.05 |