线段树模版

来源:互联网 发布:touch.js使用方法 编辑:程序博客网 时间:2024/05/22 00:20
这个是模版 建议自己写^!^个 适合自己的 才是最好的
# include <stdio.h># include <stdlib.h># define N 32# define min(a,b)((a)<(b)?(a):(b))void Found(int tree[],int X);//建立X个数据节点的线段树void Build(int tree[],int Q[],int node,int L,int R);//主函数无需调用int ABmin(int tree[],int node,int A,int B,int L,int R);void update(int tree[],int node,int X);//更新第node个节点[1,tree[0]],成功返回1 失败返回0int main(){    int A[N+1]={0},i;Found(A,7);//建立有7个节点的线段树  tree[0]=8for(i=0;i<N;i++){printf(" %d ",A[i]);if(!(i&(i+1)))//如果是2^?次幂 输出回车printf("\n");}printf("\n");update(A,1,48);for(i=0;i<N;i++){printf(" %d ",A[i]);if(!(i&(i+1)))printf("\n");}printf("\n%d ",ABmin(A,1,1,A[0],1,A[0]));    return 0;}void Found(int tree[],int X){int i,*Q=(int *)malloc((X+1)*sizeof(int));for(i=0,tree[0]=1;i<X;i++)scanf("%d",&Q[i]);while(tree[0]<X)tree[0]=(tree[0]<<1);Build(tree,Q,1,0,X-1);}void Build(int tree[],int Q[],int node,int L,int R){int X=(R+L)/2;if(R==L)       tree[node]=Q[R];else{Build(tree,Q,node*2,L,X);Build(tree,Q,node*2+1,X+1,R);tree[node]=min(tree[node*2],tree[node*2+1]);}}void update(int tree[],int node,int X)//更新第node个节点[1,tree[0]],成功返回1 失败返回0{if(node>tree[0]||node<1)return;    node+=tree[0]-1;tree[node]=X;while(node>1){node/=2;tree[node]=min(tree[node*2],tree[node*2+1]);}}//在tree[]中的[A,B]中寻找最小值  失败返回-1int ABmin(int tree[],int node,int A,int B,int L,int R){int X=(R+L)/2;if(B<=L||A>=R)  return -1;if(A<=L&&R<=B)  return tree[node];return min(ABmin(tree,node*2,A,B,L,X),ABmin(tree,node*2+1,A,B,X+1,R));   }

快速排序:

#include <stdio.h> # define N 101 void change(int *a,int *b);//交换函数 交换a b的值void quicksort(int A[],int left,int right);//对A数组排序 A[0]记录当前数组元素的个数.初始值quicksort(A,1,A[0])int main() {     int i,A[N]={0};      scanf("%d",&A[0]); //输入1--100     for(i=1;i<=A[0];i++) scanf("%d",&A[i]);     quicksort(A,1,A[0]); //快速排序调用     for(i=1;i<=A[0];i++)         printf("%d ",A[i]);     return 0; } void change(int *a,int *b)//交换函数 交换a b的值{    int temp=*a;*a=*b;*b=temp;}void quicksort(int A[],int left,int right)  {        int i=left,j=right,temp=A[left]; //temp为基准数    if(left>right)  return;      while(i!=j) //当数组左右两边没相遇    { while(A[j]>=temp && i<j)j--;  //从右向左找while(A[i]<=temp && i<j)i++; //从左向右找if(i<j)change(&A[i],&A[j]); //交换两数}     change(&A[left],&A[i]);       //基准数归位                 quicksort(A,left,i-1);         //递归左    quicksort(A,i+1,right);         //递归右}