C语言实现 设计一个算法找到数组的峰顶:分治、二分检索

这篇博客介绍了如何使用C语言设计一个算法来找到单峰数组的峰顶。首先解释了题目的含义,即在单峰数组中找到最大值的位置,该位置左侧递增,右侧递减。接着,提出了当数组长度为3时的特殊情况,以及对于长度大于3的数组,通过二分检索法来确定峰顶。在二分检索过程中,通过比较中间元素与两侧元素的关系来缩小搜索范围,最终达到O(logn)的时间复杂度。
摘要由CSDN通过智能技术生成

1、原题目:给定含有n个不同的数的数组L=<X1 , X2 , ... ,Xn>,如果L中存在Xi使得X1<X2<...<Xi-1<Xi>Xi+1>...>Xn,则称Xi是L的“峰顶”.假设L是单峰的,设计一个算法找到L的峰顶.        

2、理解题意:数组L是单峰的,那么在L的最大值(峰顶)左边的数是由小到大递增的,即一个“上坡”;在最大值右边的数是由大到小递减的,“下坡”。因此在只考虑已按题目规则排序好的数组前提下,这道题就很明了了。(一开始没读懂题目时还在纠结是不是要将原数组重新排列之后再找峰顶,但如果这样做就和找最大值无异了,而“峰顶”的定义也会变得无意义)

 

3、解题步骤:①如果数组L的长度为3,那么直接返回数组的第二个元素.

                        ②如果数组大于3,采用二分检索来找到峰顶.

                               · 假如数组的中间元素就是峰顶,那么直接返回中间元素.

                               · 假如不是,那么比较中间元素与其两边元素的大小,如果中间元素大于其左边的数且小于右边的数,那么峰顶在右边的数组,递归直到数组的长度等于3,返回中间元素.如果中间元素小于其左边的数且大于右边的数,那么峰顶在左边的数组,递归直到数组的长度等于3,返回中间元素.

4、代码实现:

#include<stdio.h>

int findPeak(int L[],int start,int end)
{
	int m
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值