https://www.acmicpc.net/problem/2751
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
퀵 정렬
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void quick_sort(vector<int> &v, int left, int right)
{
	int pl = left;
	int pr = right;
	int x = v[(pl + pr) / 2];	// 피벗값 : L인덱스와 R인덱스의 중앙에 있는 값
	/*
		피벗값을 중심으로 L인덱스의 값과 R인덱스의 값을 교환
		L인덱스가 R인덱스보다 커지면 반복문 종료
	*/
	do {
		while (v[pl] < x) ++pl;
		while (v[pr] > x) --pr;
	
		if (pl <= pr)
		{
			swap(v[pl], v[pr]);
			++pl;
			--pr;
		}
	} while (pl <= pr);
	// 재귀함수 호출로 더 작은 부분에 대하여 똑같은 정렬과정 실행
	if (left < pr)
	{
		quick_sort(v, left, pr);
	}
	if (pl < right)
	{
		quick_sort(v, pl, right);
	}
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	// 입력
	int N;
	cin >> N;
	vector<int> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> v[i];
	}
	// 퀵 정렬
	quick_sort(v, 0, N - 1);
	// 출력
	for (int i = 0; i < N; ++i)
	{
		cout << v[i] << '\n';
	}
	return 0;
}
물론 라이브러리를 이용하면 sort() 한줄로 끝나는 문제이다.
그냥 퀵 소트 연습용으로 풀어보았다.
작은 부분으로 쪼개가며 정렬을 반복하므로 시간복잡도는 O(n * log n)이다.
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ]1377번: 버블 소트 (c++) (0) | 2020.07.07 | 
|---|---|
| [BOJ]11652번: 카드 (c++) (0) | 2020.07.07 | 
| [BOJ]10989번: 수 정렬하기 3 (c++) (0) | 2020.07.06 | 
| [BOJ]10825번: 국영수 (c++) (0) | 2020.07.06 | 
| [BOJ]10814번: 나이순 정렬 (c++) (0) | 2020.07.06 | 
댓글