分治算法

排序的分治算法

分治的思想在于:
将原问题分解为几个规模较小但类似于原问题的子问题, 递归的求解这些子问题,然后再合并这些子问题的解法建立原问题的解

// 分治算法
//  输入为
// 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) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值