一、带递归的合并排序
#include<iostream>
using namespace std;
void copy(int a[], int b[], int left,int right)
{
for (int i = left; i<= right; i++)
a[i] = b[i];
}
void meg(int a[], int b[], int l, int m, int r)
{
int i = l, j = m + 1, k = l;
while ((i <= m) && (j <= r))
{
if (a[i] <a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
while (i <= m)
b[k++] = a[i++];
while (j <= r)
b[k++] = a[j++];
}
void sort(int a[] ,int left , int right)
{
int b[1000]; //或者:int* b = new int[right + 1 -left];
if (left < right)
{
int i = (left + right) / 2;
sort(a, left, i);
sort(a,i + 1, right);
meg(a, b, left, i, right);
copy(a, b, left, right);
}
}
int main()
{
int n;
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, 0, n -1);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}
二、不带递归的合并排序
#include<iostream>
using namespace std;
template<typename T>
void Merge(T a[], T p[], int l, int m, int r)
{
int left = l, j = m + 1, k = l;
while ((left <= m) && (j <= r))
{
if (a[left] <= a[j])
p[k++] = a[left++];
else
p[k++] = a[j++];
}
if (left > m)
for (int q = j; q <= r; q++)
p[k++] = a[q];
if (j > r)
for (int q = left; q <= m; q++)
p[k++] = a[q];
/*
while (left <= m)
p[k++] = a[left++];
while (j <= r)
p[k++] = a[j++];
*/
}
template<typename T>
void MergePass(T a[], T p[], int s, int b)
{
int i = 0;
while (i <= b - 2 * s)
{
Merge(a, p, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (i + s < b)
Merge(a, p, i, i + s - 1, b - 1);
else
for (int q = i; q < b; q++)
p[q] = a[q];
}
template<typename T>
void MergeSort(T a[], int b)
{
T* p = new T[b];
int s = 1;
while (s < b)
{
MergePass(a, p, s, b);
s += s;
MergePass(p, a, s, b);
s += s;
}
}
int main()
{
int m;
cin >> m;
int* a = new int[m];
for (int i = 0; i < m; i++)
cin >> a[i];
MergeSort(a, m);
for (int i = 0; i < m; i++)
cout << a[i] << ' ';
return 0;
}