分治法(第k小元素poj
第六章 分 治 6.1 引言 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 战略 算法设计技术 划分——治理——组合 6.1.1算法总体思想 将要求解的较大规模的问题分割成k个更小规模的子问题。 棋盘覆盖问题 6.1.2一个简单例子 问题一:在一个整数组A[1...n]中,同时寻找最大值和最小值 方法一:顺序扫描法 S1: min=A[1];max=A[1]; S2: 扫描数组,对i从2到n做: S2a: 如果A[i]max,则max=A[i]; S3: 返回x,y的值 比较次数:2n-2 方法二:分治法 基本思想: (1)划分:将数组分割成两半 (2)治理:在每一半中找到最大值和最小值。 (3)合并:返回两个最大值中的最大值和两个最小值中的最小值。 算法6.1 Minmax(int low,int high) {if high-low=1 then if A[low]2 求解递推式得: C(n)=3n/2-2 6.2 二分搜索 问题:在一个有序序列中搜索给定值x,若找到,返回x所在位置,否则返回查找失败标志-1。 二分搜索过程 算法6.2 二分搜索的非递归算法 int BinarySearch(int a[], int n, int x ) { int low=0;high=n-1; while (high >= low){ //待搜区间非空 int mid = (low+ high )/2; if (x == a[mid]) return mid; //查找成功 if (x < a[mid]) high = mid-1; else low = mid+1; } return -1; //查找失败,返回-1 } 算法6.3 二分搜索的递归算法 int BSearch(int a[], int n, int x,int low,int high ) { if(low>high)return -1 //待搜区间为空 else { int mid = (low+ high )/2; if (x == a[mid]) return mid; //查找成功 if (x < a[mid]) return BSearch(a,n,x,low,mid-1); else return BSearch(a,n,x,mid+1,high); } } 二分搜索算法分析 时间复杂度分析: 1 若n=1 C(n)=