백준 2751
merge sort를 이용해 풀었다. 그런데 출력에서 std::endl 을 사용했을 때는 안됐는데 "\n"을 사용하니까 됐다. endl 은 버퍼를 flush해서 느리다고 한다.
#include<iostream>
class Merge
{
int* temparr = nullptr;
int* arr = nullptr;
int size;
public:
Merge(int n) :size(n)
{
arr = new int[size];
temparr = new int[size];
MakeArr();
}
~Merge()
{
if (arr != nullptr)
delete[] arr;
}
void Sort()
{
MergeSort(0,size-1);
}
void Print()
{
for (int i = 0; i < size; i++)
{
std::cout << arr[i]<<"\n";
}
}
private:
void MergeSort(int a, int z)
{
if (a >= z)
return;
int middle = (a + z) / 2;
MergeSort(a,middle);
MergeSort(middle+1,z);
Merging(a,z,middle);
}
void Merging(int a, int z, int middle)
{
int left=a;
int right=middle+1;
for(int cnt = a; cnt<=z; cnt++)
{
if (left > middle)
{
temparr[cnt] = arr[right++];
continue;
}
if (right > z)
{
temparr[cnt] = arr[left++];
continue;
}
if (arr[left] < arr[right])
temparr[cnt] = arr[left++];
else
temparr[cnt] = arr[right++];
}
for (int i = a; i <= z; i++)
arr[i] = temparr[i];
}
void MakeArr()
{
for (int i = 0; i < size; i++)
{
std::cin >> *(arr + i);
}
}
};
int main()
{
int n;
std::cin >> n;
Merge qarr(n);
qarr.Sort();
qarr.Print();
}