数组排序任务可以如下完成:
1)把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
#include<iostream>
using namespace std;
void MergeSort(int a[], int s, int e, int tmp[]);
void Merge(int a[], int s, int m, int e, int tmp[]);
const int maxn = 10000;
int a[maxn];
int b[maxn];
int main(){
int n;
cin >> n;
for (int i = 0; i < n; i++){
cin >> a[i];
}
MergeSort(a, 0, n - 1, b);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cin.get();
cin.get();
return 0;
}
void MergeSort(int a[], int s, int e, int tmp[]){
if (s < e){
int m = s + (e-s) / 2;
MergeSort(a, s, m, tmp);
MergeSort(a, m+1, e, tmp);
Merge(a, s, m, e, tmp);
}
}
void Merge(int a[], int s, int m, int e, int tmp[]){
int p = 0; int p1 = s; int p2 = m + 1;
while (p1 <= m&&p2 <= e){
if (a[p1] < a[p2]){
tmp[p] = a[p1];
p++; p1++;
}
else if (a[p1]>=a[p2]){
tmp[p] = a[p2];
p++; p2++;
}
}
while (p1 <= m){
tmp[p] = a[p1];
p++; p1++;
}
while (p2 <= e){
tmp[p] = a[p2];
p++; p2++;
}
for (int j = 0; j < e - s + 1; ++j)
a[s + j] = tmp[j];
}