算法设计与分析之减治法

减治法部分的初步学习,从下面三个例子:

1.折半查找

2.二叉树查找

3.查找最小数


减治法的核心:

与分治法不同,减治法只针对其部分子问题进行求解,同时也是采取划分后选择计算的思想


补充知识点

中位数:

中位数是一个非常具有代表性的数字,我们在现实生活中,通常会选择中位数来代表

一部分数据的趋势,相比于平均数更加具有代表性。


1.折半查找:

 #include<iostream>
 using namespace std;
 int searchMin(int r[],int low,int heigh,int k)
 {
     int mid=(low+heigh)/2;
     if(low>heigh)
     return 0;
     if(r[mid]==k)
    return mid+1;
    else if(r[mid]>k)
        return searchMin(r,low,mid-1,k);
    else
        return searchMin(r,mid+1,heigh,k);
 }
 int main()
 {
     int a[10]={1,3,5,8,12};
     int k=0;
    cin>>k;
     cout<<searchMin(a,0,4,k);
     return 0;
  } 



2.二叉查找树

//二叉查找树
#include<iostream>
using namespace std;
struct BiNode
{
    int data;
    BiNode *lchild;
    BiNode *rchild;
};

BiNode * SearachBST(BiNode *root,int k)
{
    if(root==NULL)
        return NULL;
    else if(root->data ==k )
    {
        cout<<"找到了 "<<root->data<<endl;
        return root;
    }
        else if(k<root->data)
            return SearachBST(root->lchild,k);
        else
            return SearachBST(root->rchild,k);
}

BiNode * InsertBST(BiNode * root,int data)
{
    if(root==NULL)
    {
        root=new BiNode;
        root->data=data;
        root->lchild=root->rchild=NULL;
        return root;
    }
    if(data<=root->data)
        root->lchild=InsertBST(root->lchild,data);
    else
        root->rchild=InsertBST(root->rchild,data);
    return root;
}

BiNode * createBST(int a[],int n)
{
    //为 T 申请一个新结点,该结点为叶子 
    BiNode *T=new BiNode;
    T->data=a[0];T->lchild=T->rchild=NULL; 
    for(int i=0;i<n;i++)
    {
        InsertBST(T,a[i]);
        /*if(T->data==0)
        cout<<"T==NULL";*/    
    }
    return T;

}


int main()
{
    BiNode * TR=new BiNode;
    int r[100]={10,45,67,83,42,58,55,90,70,63};
    TR=createBST(r,10);
    for(int i=0;i<10;i++)
        cout<<SearachBST(TR,r[i])<<" ";
    return 0;
}



3.查找最小数

思想:
快速排序的patition下得出的位置是稳定的
我们通过这位位置和K进行比较 从而找出需要我们排序的那一部分

//查找第K小的数
#include<iostream>
using namespace std;

int patition(int r[],int low,int heigh)
{
    int i=low,j=heigh;
    while(i<j &&r[i]<r[j])
    j--;
    if(i<j&& r[i]>r[j])
    {
        int temp=r[i];
        r[i]=r[j];
        r[j]=temp;
        i++;
    }
    while(i<j &&r[i]<r[j])
    i++;
    if(i<j&& r[i]>r[j])
    {
        int temp=r[i];
        r[i]=r[j];
        r[j]=temp;
        j++;
    }
    return i;
    
}

int searchMinK(int r[],int low,int heigh,int k)
{
    int pv=0;
    pv=patition(r,low,heigh);
    if(pv==k)
    return r[k];
    else if(pv>k)
        return searchMinK(r,low,pv-1,k);
        else
        return searchMinK(r,pv+1,heigh,k);
}

int main()
{
    int a[10]={1,8,4,3,5};
    int k=0;
    cin>>k;
    cout<<searchMinK(a,0,4,k);    
    return 0;
 }
 


猜你喜欢

转载自blog.csdn.net/qq_37457202/article/details/80077836