分治法(归并排序,二分查找,x的n次方,斐波那契(Fibonacci)数列,斯特拉森(Strassen)矩阵乘法)

一、归并排序

//归并排序 
/*递归分治将n个数据化成一颗高度为logn的二叉树
再进行一次线性比较,时间复杂度为nlogn */
#include<iostream>
using namespace std;
const int N = 10005;
int a[N],b[N];
void mergesort(int l,int r)
{
    if(r-l>1)
    {
        int m = l+(r-l)/2;
        mergesort(l,m);
        mergesort(m,r);
        int p = l,q = m;i = x;
        while(p<m || q<y)
        {
            if(q>=y || (p<m && a[p]<=a[q]))
                b[i++] = a[p++];
            else
                b[i++] = a[q++];
        }
    }
}
int main()
{
    int n;      cin >> n;
    for(int i=0; i<n; i++)      cin >> a[i];
    mergesort(0,n);
    for(int i=0; i<n; i++)      cout << b[i];
    return 0;
}

二、二分查找

//二分查找
/*每次都二分一下,时间复杂度为logn */
#include<iostream>
using namespace std;
const int N = 10005;
int a[N];
int binaryfind(int key,int l,int r)
{
    int mid = l+(r-l)/2;
    if(a[mid] == key)   return mid;
    else if(a[mid]>key) return binaryfind(key,l,mid);
    else if(a[mid]<key) return binaryfind(key,mid,r);
 } 
int main()
{
    int n;      cin >> n;
    for(int i=0; i<n; i++)      cin >> a[i];
    int q;      cin >> q;
    cout << binaryfind(q,0,n) << endl;
    return 0;
}

三、x的n次方

#include <stdio.h>
#include <stdlib.h>
#include <string>
typedef long long LL;
using namespace std;

/* T(n) = T(n/2) + ⊙(1) = log(n) */

double f(double x, int n)
{
    if(1 == n) return x;
    int mid = (n>>1);
    double s = f(x, mid);
    if(n & 1) return s * s * x;
    else return s * s;
}

double Pow(double x, int n)
{
    if(0 == x && n > 0) return 0.0;
    else if(0 == n) return 1.0;
    else if(n > 0) return f(x, n);
    else if(n < 0) return (1/f(x, -n));
}

int main()
{
    double x;
    int n;
    while(~scanf("%lf%d", &x, &n)){
        printf("%0.6lf\n", Pow(x, n));
        printf("%0.6lf\n", pow(x, n));
    }
}

四、斐波那契数列
如图有公式这里写图片描述。公式证明这里不再赘述,移步这里查看证明

未完待续
发布了16 篇原创文章 · 获赞 2 · 访问量 3904

猜你喜欢

转载自blog.csdn.net/lang_a/article/details/81233296