减治法部分的初步学习,从下面三个例子:
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; }