归并排序比如3 2 4 1 5,原理就是先把他分成两段,3 2一段, 4 1 5一段,然后对每一段再进行分段,比如3 2 分成3的一段和2的一段,不停的分,直到一段中只有一个数,然后再对两段进行排序,合并,就可以很容易的想到递归的写法;
queue队列的写法
#include <bit/sdc++.h>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
long long a[N], n,result[N];
queue<int> gbpx(int left, int right)
{
if (right - left > 0)
{
ll mid = left + right + 1 >> 1;
queue<int> l=gbpx(left, mid - 1);
queue<int> r=gbpx(mid, right);
queue<int> s,*ps;
while (l.size() && r.size())
{
int n;
(l.front() > r.front()) ? (n=r.front(),r.pop()) : (n=l.front(),l.pop());
s.push(n);
}
if (l.size())
{
ps = &l;
}
else
ps = &r;
while (ps->size())
{
s.push(ps->front());
ps->pop();
}
return s;
}
else
{
queue<int> s;
s.push(a[left]);
return s;
}
}
int main()
{
cin >> n;
for (int j = 0; j < n; j++)
cin >> a[j];
queue<int> s=gbpx(0, n - 1);
while (s.size())
{
cout << s.front() << ' ';
s.pop();
}
}
vector写法:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
int n;
vector<int> book;
vector<int> gbpx(int left, int right)
{
if (left < right)
{
int mid = left + right + 1 >> 1;
vector<int> l = gbpx(left, mid - 1);
vector<int> r = gbpx(mid, right);
vector<int> s;
int ljs=0, rjs = 0;
int* ps = NULL;
vector<int>* point = NULL;
while (ljs != l.size() && rjs != r.size())
{
(l[ljs] < r[rjs]) ? (ps=&ljs,point=&l) : (ps=&rjs,point=&r);
s.push_back(point->at(*ps));
(*ps)++;
}
if (ljs == l.size())
{
ps = &rjs;
point = &r;
}
else
{
ps = &ljs;
point = &l;
}
while (*ps != point->size())
{
s.push_back(point->at(*ps));
(*ps)++;
}
return s;
}
else
{
vector<int> s;
s.push_back(book[left]);
return s;
}
}
int main()
{
cin >> n;
for (int j = 0; j < n; j++)
{
int g = 0;
cin >> g;
book.push_back(g);
}
vector<int> result = gbpx(0, n - 1);
for (int j = 0; j < n; j++)
{
cout << result[j] << ' ';
}
}