一、原文链接
第二章-2.3-分析算法(分治法及其分析、归并排序)
伪代码:
MERGE(A,p,q,r)
//写出n1和n2的数量
n1 = q - p + 1
n2 = r - q
//让两个数组合并成一个数组
Let L[1..n1+1] and R[1..n2+1] be new arrays
//分别将A中两个子序列赋值给数组L和R
for i = 1 to n1
L[i] = A[p + i - 1] //从A的第p位开始赋值
for j = 1 to n2
L[j] = A[q + j] //从A的第q+1位开始赋值
//引入两张零分试卷
L[n1+1] = 0
R[n2+2] = 0
i = 1
j = 1
//比较各自最大的试卷,抽出更大的
for k = p to r
if L[i] >= R[j]
A[k] = L[i]
i = i + 1
else A[k] = R[j]
j = j + 1
二、代码
#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
void Merge(vector<int>& A, int p, int q, int r)
{
int n1 = q - p + 1;//L容量为q-p+1
int n2 = r - q;//R容量为r-q
//Let L[1..n1 + 1] and R[1..n2 + 1] be new arrays
vector<int> L, R;
for (int i = 1; i <= n1; i++) {
L.push_back(A[p + i - 1]);
}
for (int j = 1; j <= n2; j++) {
R.push_back(A[q + j]);
}
L.push_back(INT_MAX);
R.push_back(INT_MAX);
//分别抽出最大的数字
int i = 0;
int j = 0;
for (int k = p; ; k++) {
if (L[i] == INT_MAX && R[j] == INT_MAX) {
break;
}
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
}
//递归函数
void Merge_sort(vector<int>& A, int p, int r)
{
if (p < r) {
int q = (p + r) / 2;
Merge_sort(A, p, q);
Merge_sort(A, q + 1, r);
Merge(A, p, q, r);
}
}
int main()
{
vector<int> A;
cout << "Please enter the number you want!" << endl;
int n, m;
cin >> n;
cout << "Please enter the numbers in array!" << endl;
for (int i = 0; i < n; i++) {
cin >> m;
A.push_back(m);
}
Merge_sort(A, 0, A.size() - 1);
cout << "These are the sorted numbers:" << endl;
for (int i = 0; i < A.size(); i++) {
cout << A[i] << "\t";
}
}