归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
具体的操作方法为对其不断地分割为两半并对两半进行排序,最后统一进行排序。因此,可以使用递归对不断的分割排序。
自己手动模拟了整个过程,尚需优化。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<string>
using namespace std;
const int MAXN = 10005;
int num[MAXN];
int flag[MAXN];
void P(int l, int r)
{
if(l == r)
return ;
int m = (l + r) / 2;
P(l, m);
P(m + 1, r);
int a = l;
int b = m + 1;
int k = l;
while(a <= m && b <= r)
{
if(num[a] < num[b])
flag[k++] = num[a++];
else if(num[a] > num[b])
flag[k++] = num[b++];
else if(num[a] == num[b])
{
flag[k++] = num[a++];
flag[k++] = num[b++];
}
}
if(b == r + 1)
for(int i = a; i <= m; i++)
flag[k++] = num[i];
else if(a == m + 1)
for(int i = b; i <= r; i++)
flag[k++] = num[i];
for(int i = l; i <= r; i++)
num[i] = flag[i];
}
int main()
{
int n;
while(~scanf("%d", &n))
{
memset(num, 0, sizeof(num));
memset(flag, 0, sizeof(flag));
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
P(1, n);
for(int i = 1; i <= n; i++)
printf("%d||", num[i]);
cout << endl;
}
return 0;
}
在对比网上的代码后, 终于完成了归并排序,上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int MAXN = 10005;
int num[MAXN];
int flag[MAXN];
void P(int l, int r)
{
if(l == r)
return ;
int m = (l + r) / 2;
P(l, m);
P(m + 1, r);
int a = l;
int b = m + 1;
int k = l;
while(a <= m && b <= r)
{
if(num[a] < num[b])
flag[k++] = num[a++];
else if(num[a] > num[b])
flag[k++] = num[b++];
else if(num[a] == num[b])
{
flag[k++] = num[a++];
flag[k++] = num[b++];
}
}
while(a <= m)
flag[k++] = num[a++];
while(b <= r)
flag[k++] = num[b++];
for(int i = l; i <= r; i++)
num[i] = flag[i];
}
int main()
{
int n;
while(~scanf("%d", &n))
{
memset(num, 0, sizeof(num));
memset(flag, 0, sizeof(flag));
for(int i = 1; i <= n; i++)
scanf("%D", &num[i]);
P(1, 10);
for(int i = 1; i <= n; i++)
printf("%d ", num[i]);
printf("\n");
}
return 0;
}