Pagini recente » Cod sursa (job #1996312) | Cod sursa (job #2079516) | Cod sursa (job #3197874) | Cod sursa (job #459060) | Cod sursa (job #782729)
Cod sursa(job #782729)
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
int *aux;
vector<int> v;
inline void swap(int &x, int &y) {int aux = x; x = y; y = aux;}
void InsertionSort(int start, int end)
{
int i, j;
for(i=start+1; i <= end; ++i)
{
for(j = i; j > start && v[j] < v[j-1]; --j)
swap(v[j], v[j-1]);
}
}
void MergeSort(int left, int right)
{
if(left >= right)
return;
else if(1 == right - left)
{
if(v[right] < v[left])
swap(v[right], v[left]);
}
else if(right - left <= 8)
{
InsertionSort(left, right);
}
else {
int i, j, k;
int middle = left + ((right - left)>>1);
MergeSort(left, middle);
MergeSort(middle+1, right);
if(v[middle] <= v[middle+1])
return;
copy(v.begin()+left, v.begin()+right+1, aux+left);
for(i = k = left, j = middle + 1; k <= right; ++k)
{
if(i <= middle)
{
if(j <= right)
{
if(aux[i] <= aux[j])
{
v[k] = aux[i];
++i;
}
else {
v[k] = aux[j];
++j;
}
}
else {
v[k] = aux[i];
++i;
}
}
else {
v[k] = aux[j];
++j;
}
}
}
}
int main()
{
int N;
ifstream in("algsort.in");
ofstream out("algsort.out");
in>>N;
aux = new int[N];
copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
MergeSort(0, N-1);
copy(v.begin(), v.end(), ostream_iterator<int>(out, " "));
out<<'\n';
delete[] aux;
return EXIT_SUCCESS;
}