分治算法

来源:互联网 发布:神机妙算软件购买 编辑:程序博客网 时间: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