1,可以将者看成两个独立的问题。
个需要比较N次,需要比较2*N次。
2,我们可以两两分组。
每一对中较小的放左边,较大放右边。 N/2次。
奇数位比较N/2次,找到最小值。
偶数位比较N/2次,找到最大值。
总的比较次数:1.5N。
缺点:破坏了原数组。
3,维持两个变量min和max。
取出两个数,相比较1次。
较小的和min比较,决定是否更新min。
同理,更新max。
可见处理两个数,比较3次。
总的比较次数:1.5N
优点:不会破坏原来的数组。
4,分治思想
#include <iostream>
using namespace std;
void maxmin(int a[],int low,int high,int& max,int& min) //引用作为参数的强大作用
{
int k, max1,min1,max2,min2;
if(high-low==1||high-low==0)
{
a[low]>a[high]? (max = a[low], min = a[high]):(max = a[high], min = a[low]);
}
else
{
k=(high+low)/2;
maxmin( a,low,k,max1,min1);
maxmin( a,k+1,high,max2,min2);
//一层比较两次
max=max1>max2? max1:max2;
min=min1<min2? min1:min2;
}
}
int main()
{
int max,min;
int data[]={8,3,6,2,1,9,4,5,7};
int num=sizeof(data)/sizeof(data[0]);
maxmin(data,0,num-1,max,min);
cout<<"最大值:"<<max<<endl;
cout<<"最小值:"<<min<<endl;
return 0;
}
复杂度分析:
f(2) = 1;
f(n) = 2*f(n/2) + 2; (注:一层需要比较两次)
可以推出f(n) = 1.5*n -2;
可见总的比较次数仍然没有减少。
分享到:
相关推荐
2.9 求一个二维数组的最大值和最小值 2.10 求一个4*4矩阵所有元素的和 3 循环结构程序题 3.1 输入一个大于3的整数n,判断它是否为素数(素数又称质数,就是除了能被1和它本身整除之外,不能被其它自然数整除的自然数...
1.3 寻找两个排序数组的中位数 1.4 最长连续序列 1.5 累加和 1.6 移除数组中指定值 1.7 下一个排列 1.8 第n个全排列 1.9 验证数独的正确性 1.10 容纳雨水的量 1.11 旋转图像 1.12 数字加1 1.13 爬楼梯 1.14 格雷码 ...
- **功能**: 寻找数组中的最大值。 - **参数**: - `int list_pri[]`: 需要查找最大值的数组。 #### 2.10 `find_max_t1` 函数 - **功能**: 特定情况下寻找最大值。 - **参数**: - `int list_pri[]`: 需要查找最大...
求极值的基本思想是从给定的一组数中找到最大值或最小值,通常采用循环结构来进行比较。 ##### 2.4 排序 排序算法是计算机科学中的一个重要组成部分。常见的排序算法包括选择法、冒泡法、插入法和归并法等。每种...
求最大值或最小值的问题在C语言中可以通过一次循环和比较操作轻松解决,但对于大数据集,算法的选择和优化则显得尤为重要。 #### 3.9 数字反序 数字反序是一个简单的字符串操作示例,通过C语言的字符串函数和循环...
- `max()`、`min()`:查找最大值和最小值。 - `sd()`:计算标准差。 ##### 2.8 查看内存中已有的对象 - `ls()`:列出当前环境中所有的对象名称。 - `rm(list=ls())`:删除当前环境中的所有对象。 ##### 2.9 访问...
MATLAB提供了许多用于处理向量的内置函数,例如求和、最大值、最小值等。 **2.8 其他有用内置函数** 除了上述函数外,MATLAB还提供了其他一些有用的内置函数,如`size`、`length`等,用于查询数组的维度信息。 **...
赢家树是一种特殊的数据结构,用于高效地维护一组数据中的最大值或最小值。它常用于在线游戏中实时更新排名列表等场景。 #### 1.6 数字树 (Digital Tree) 数字树也称为Trie树,是一种用于处理字符串的树形结构。在...
- 更新树状数组中某个位置的值。 **3.3.3 前缀和A[1]+…+A[p]** - 通过树状数组快速计算从1到p的累加和。 **3.3.4 一个二维树状数组的程序** - 介绍如何实现和使用二维树状数组。 **3.4 线段树** - 线段树是一...
线段树是一种支持区间查询和更新操作的数据结构,通常用于处理区间最大值、最小值等问题。 ##### 3.5 字符串 字符串处理是编程中的常见需求,涉及到许多算法和技术。 - **字符串哈希**:通过计算字符串的哈希值来...
可能是一种优化问题,如求解函数的最大值或最小值,需要运用微积分或线性规划的知识。 #### 3.9 数字反序 涉及到数字字符串的反转,可能需要用到字符串操作或数字转换技术,是基础算法中的常见练习。 #### 3.10 ...
- **解答**:首先遍历每行,记录每行的最大值及其位置;再遍历这些位置所在的列,检查是否为最小值。 **实验0.6:复数类** - **题目**:定义一个复数类,包括加法、减法等运算。 - **解答**:创建一个复数类,定义...
- **Range Minimum Query (RMQ)**:在数组中寻找指定区间的最小值。 - **Lowest Common Ancestor (LCA)**:寻找一棵树中两个节点的最近公共祖先。 - **Reduction from LCA to RMQ**:如何将 LCA 问题转换为 RMQ 问题...
3.5.1 定义和初始化内置数组 101 3.5.2 访问数组元素 103 3.5.3 指针和数组 105 3.5.4 C风格字符串 109 3.5.5 与旧代码的接口 111 3.6 多维数组 112 小结 117 术语表 117 第4章 表达式 119 4.1 ...