分治法的另一种经典引用,这里贴上递归和非递归的代码。(递归版本是为了防止我忘记太多的C++知识,所以应用了模板类)
递归版本:
#include<iostream>
#define T double
using namespace std;
T a[10000] = {0};
int N;
template <typename Type>
void Merge(int left, int middle, int right){
int len = right - left + 1;
int i = left, j = middle + 1, m = 0;
T *b = new T[len];
for(m = 0; i <= middle && j <= right; m++){
if(a[i] < a[j]) b[m] = a[i++];
else b[m] = a[j++];
}
for(; i <= middle; m++, i++) b[m] = a[i];
for(; j <= right; m++, j++) b[m] = a[j];
for(int i = 0; i < len; i++){
a[left + i] = b[i];
}
}
template <typename Type>
void MergeSort(int left, int right){
if(left < right){
int middle = (left + right) / 2;
MergeSort<Type>(left, middle);
MergeSort<Type>(middle + 1, right);
Merge<Type>(left, middle, right);
}
}
int main(){
cin >> N;
for(int i = 0; i < N; i++) cin >> a[i];
MergeSort<T>(0, N - 1);
for(int i = 0; i < N; i++){
if(i == 0) cout << a[i];
else cout << ' ' << a[i];
}
}
非递归版本:
#include<iostream>
#define MAX 0x7FFFFFFF
using namespace std;
void MergeSort(int n);
void MergePass(int step, int n);
void Merge(int left, int middle, int right);
int a[10000] = {0};
int N;
void MergeSort(int n){
//分组,每组进行一次归并排序
for(int i = 1; i < n; i *= 2)
MergePass(i, n);
}
void MergePass(int step, int n){
//划分, 合并成2 * step的有序数组
int i, j;
for(i = 0; i + 2 * step - 1 < n;i = j + 1){
j = i + 2 * step - 1;
Merge(i, i + step - 1, i + 2 * step - 1);
}
if(n - i > step){
//剩下元素大于step小于2 * step
Merge(i, i + step - 1, n - 1);
}else if(n - i > 0){
//剩余元素小于step个
Merge(i, i, n - 1);
}
}
void Merge(int left, int middle, int right){
if(left == right) return ;
int len = right - left + 1;
int *b = new int[len];
for(int i = 0, m = left, n = middle + 1; i < len; i++){
if(a[m] < a[n]){
b[i] = a[m];
if(m < middle) m++;
else a[m] = MAX;
}else{
b[i] = a[n];
if(n < right) n++;
else a[n] = MAX;
}
}
for(int i = 0; i < len; i++){
a[left + i] = b[i];
}
}
int main(){
cin >> N;
for(int i = 0; i < N; i++) cin >> a[i];
MergeSort(N);
for(int i = 0; i < N; i++){
if(i == 0) cout << a[i];
else cout << ' ' << a[i];
}
}
1849

被折叠的 条评论
为什么被折叠?



