用分治法求解查找问题(折半查找、查找第k小元素)

一、折半查找
针对的是有序的数组
(1)基本思想在这里插入图片描述
(2)算法

int BinSearch(int a[]int low,int high,int k) //拆半查找算法
{  int mid;
   if (low<=high)  //当前区间存在元素时
   { mid=(low+high)/2; //求查找区间的中间位置
    if (a[mid]==k)  //找到后返回其物理下标mid
      return mid;
    if (a[mid]>k)  //当a[mid]>k时
      return BinSearch(a,low,mid-1,k);
    else   //当a[mid]<k时
       return BinSearch(a,mid+1,high,k);
   }
  else return -1;  //若当前查找区间没有元素时返回-1
}

(3)算法分析
在这里插入图片描述
二、查找第k小元素
采用类似于快速排序的思想,减治法
(1)问题描述在这里插入图片描述
举例:在这里插入图片描述
(2)基本思想在这里插入图片描述

int QuickSelect(int a[]int s,int t,int k)//在a[s..t]序列中找第k小的元素
{  int i=s,j=t,tmp;
   if (s<t)
   {  tmp=a[s];
      while (i!=j)    //从区间两端交替向中间扫描,直至i=j为止
      {         
         while (j>i && a[j]>=tmp) 
             j--;
     a[i]=a[j];  //将a[j]前移到a[i]的位置
     while (i<j && a[i]<=tmp) 
         i++;
     a[j]=a[i];  //将a[i]后移到a[j]的位置
      }
      a[i]=tmp;
      if (k==i) 
          return a[i];
      else if (k<i) 
           return QuickSelect(a,s,i-1,k);//在左区间中递归查找
      else 
           return QuickSelect(a,i+1,t,k-i); //在右区间中递归查找
   }
   else if (s==t && s==k) //区间内只有一个元素且为a[k]
      return a[k];
}

(3)算法分析
在这里插入图片描述

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是利用分治求解查找最大和最小元素的 C++ 实现: ```cpp #include <iostream> #include <vector> using namespace std; // 分治查找最大和最小元素 pair<int, int> findMaxAndMin(vector<int>& nums, int left, int right) { // 只有一个元素 if (left == right) { return make_pair(nums[left], nums[left]); } // 只有两个元素 if (left + 1 == right) { return make_pair(min(nums[left], nums[right]), max(nums[left], nums[right])); } // 分治查找左右子区间的最大和最小元素 int mid = (left + right) / 2; auto leftPair = findMaxAndMin(nums, left, mid); auto rightPair = findMaxAndMin(nums, mid + 1, right); // 合并得到整个区间的最大和最小元素 return make_pair(min(leftPair.first, rightPair.first), max(leftPair.second, rightPair.second)); } int main() { vector<int> nums = { 3, 1, 4, 2, 5 }; int n = nums.size(); auto result = findMaxAndMin(nums, 0, n - 1); cout << "最小值:" << result.first << endl; cout << "最大值:" << result.second << endl; return 0; } ``` 其中,`findMaxAndMin` 函数采用递归的方式进行分治,首先判断区间内是否只有一个元素或两个元素,再分别递归查找左右子区间的最大和最小元素,最后将左右子区间的结果进行合并得到整个区间的最大和最小元素。实现过程中,使用 `pair` 类型来同时返回最大和最小元素,方便输出结果。在 `main` 函数中,调用 `findMaxAndMin` 函数并输出最大和最小元素的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值