分治法模式:
分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。
解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
合并这些子问题的解成原问题的解。
对于归并排序:
分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
解决:使用归并排序递归地排序两个子序列。
合并:合并两个已排序的子序列。
算法特征:
时间复杂度为O(nlgn),不稳定排序。
#include <iostream>
#include <limits>
using namespace std;
void MergeSort(int A[], int left, int right);
void Merge(int A[], int left, int mid, int right);
int main()
{
int A[] = {2, 4, 5, 7, 1, 2, 3, 6};
MergeSort(A, 0, 7);
for(int i = 0; i < 8; i ++)
cout << A[i] << ' ';
return 0;
}
void MergeSort(int A[], int left, int right)
{
int mid;
if(left < right)
{
mid = (right + left) / 2;
MergeSort(A, left, mid);
MergeSort(A, mid + 1, right);
Merge(A, left, mid, right);
}
}
void Merge(int A[], int left, int mid, int right)
{
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1 + 1], R[n2 + 1];
for(int i = 0; i <= n1 - 1; i ++)
L[i] = A[left + i];
for(int j = 0; j <= n2 - 1; j ++)
R[j] = A[mid + 1 + j];
//INT_MAX整型最大值,当作L和R的结束哨兵
//L: 1,2,3,4; R:5,6,7;如果不加最大值哨兵,
//如这个例子,L的索引会增加到溢出状态
L[n1] = INT_MAX;
R[n2] = INT_MAX;
int i = 0;
int j = 0;
for(int k = left; k <= right; k ++)
{
if(L[i] <= R[j])
{
A[k] = L[i];
i ++;
}
else
{
A[k] = R[j];
j ++;
}
}
}
输出结果:1 2 2 3 4 5 6 7