排序的分治算法
分治的思想在于:
将原问题分解为几个规模较小但类似于原问题的子问题, 递归的求解这些子问题,然后再合并这些子问题的解法建立原问题的解
// 分治算法
// 输入为
// 5
// 3 1 2 4 5
// 0 4
// 输出为
// 1 2 3 4 5
#include<iostream>
using namespace std;
#define MAX 1000
int arr[MAX];
int L[MAX/2];
int R[MAX/2];
void merge(int arr[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
for (int i = 0; i < n1; ++i) L[i] = arr[p + i];
for (int j = 0; j < n2; ++j)
R[j] = arr[q + j + 1];
L[n1] = R[n2] = 100;
for (int k = p, i = 0, j = 0; k <= r; k++) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
}
}
void merge_sort(int arr[], int p, int r) {
if (p < r) {
int q = (p + r)/2;
merge_sort(arr, p, q);
merge_sort(arr, q + 1, r);
merge(arr, p, q, r);
}
}
int main() {
int n, p, q, r;
cout << "input the size of array: " << endl;
cin >> n;
for (int i = 0; i < n; ++i) cin >> arr[i];
cout << "input p, q, r please: " << endl;
cin >> p >> r;
merge_sort(arr, p, r);
for (int i = 0; i < n; ++i) cout << arr[i] << " ";
cout << endl;
return 0;
}
当 n=1 时, T(n)=Θ(1)
当 n>1 时, T(n)=2T(n/2)+Θ(n)
对上式稍作变换如下:
当 n=1 时, T(n)=c
当 n>1 时, T(n)=2T(n/2)+cn
这个式子可以不断的做递归,最后形成一个递归树的。树的第一层是 cn ,第二层是 cn/2 ,第三层是 cn/4 ,直到最后一层为 c 。第二层有2棵子树,第三层有4棵子树,直到最后一程有 n 棵子树,因此每层的代价总共为 cn 。而整个树共有 lgn+1 层,因此总代价为 cnlgn+cn 。
忽略低阶项和系数项,最终记为 Θ(nlgn) 。