分治算法
来源:互联网 发布:神机妙算软件购买 编辑:程序博客网 时间:2024/06/16 06:01
排序的分治算法
分治的思想在于:
将原问题分解为几个规模较小但类似于原问题的子问题, 递归的求解这些子问题,然后再合并这些子问题的解法建立原问题的解
// 分治算法// 输入为// 5// 3 1 2 4 5// 0 4// 输出为// 1 2 3 4 5#include<iostream>using namespace std;#define MAX 1000int 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) 。
0 0