空间优化:没必要每次开一个临时数组 可以开一个然后导回来再导出去
多适用于外排序。
void merge(int a[], int l1, int r1, int l2, int r2)
{
int i = l1, j = l2;
int temp[100], index = 0;
while (i <= r1 && j <= r2)
{
if (a[i] <= a[j])
temp[index++] = a[i++];
else
temp[index++] = a[j++];
}
while (i <= r1)
temp[index++] = a[i++];
while (j <= r2)
temp[index++] = a[j++];
for (i = 0; i < index; i++)
{
a[l1 + i] = temp[i];
}
}
void mergesort(int a[],int left,int right)
{
if (left >= right)
return;
int mid = (left + right) / 2;
mergesort(a, left, mid );
mergesort(a, mid + 1, right);
merge(a, left, mid, mid + 1,right);
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 100;
void merge(int a[], int l1, int r1, int l2, int r2)
{
int i = l1, j = l2;
int temp[100], index = 0;
while (i <= r1 && j <= r2)
{
if (a[i] <= a[j])
temp[index++] = a[i++];
else
temp[index++] = a[j++];
}
while (i <= r1)
temp[index++] = a[i++];
while (j <= r2)
temp[index++] = a[j++];
for (i = 0; i < index; i++)
{
a[l1 + i] = temp[i];
}
}
void mergesort(int a[],int left,int right)
{
if (left >= right)
return;
int mid = (left + right) / 2;
mergesort(a, left, mid );
mergesort(a, mid + 1, right);
merge(a, left, mid, mid + 1,right);
}
int main()
{
int a[maxn],n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
mergesort(a, 0, n - 1);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
}