코딩테스트/백준

백준 2751 : 수 정렬하기 2

Mev01 2020. 8. 21. 20:51

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