线段树模版
来源:互联网 发布: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); //递归右}
阅读全文
1 0
- 线段树 模版
- 线段树模版
- 线段树模版
- 二维线段树模版
- 刘汝佳--线段树模版
- 线段树模版
- 线段树模版
- 线段树模版
- 线段树模版
- 线段树模版
- 【笔记+模版】 线段树
- [模版]线段树
- 线段树模版和学习
- 线段树模版(转)
- 线段树 区间更新 模版
- 模版(自建线段树)
- 洛谷p3372 线段树模版
- 线段树知识点模版详解
- 数据压缩原理实验3_实验报告
- hadoop搭建教程,多环境通吃
- LeetCode No.7 Reverse Integer
- 【设计模式】—— 单例模式Singleton
- Python数据类型和变量5.16
- 线段树模版
- Java String类常用方法介绍(3)
- Python输错重输while小程序
- 树莓派与笔记本用远程桌面连接(Xrdp远程桌面服务)
- 基于 Redis 的分布式锁到底安全吗(上)?
- VUI-百度语音之Rest接口python学习笔记1-获取Token
- python3.5.2安装selenium3.4.1及firefox和chrome浏览器设置
- JS知识点
- java通过FreeSShd客户端连接windows 执行shell脚本