算法分析:最值查找 在长度为n的整数列中搜索最大数和最小数 JAVA

【最值查找】请设计一个分治算法,从一个长度为n的整数序列中搜索最大元素和最小元素。

 

算法设计思路

递归把数组分成两个两个对比,比较完排好序,存到一个数组中,然后最大的跟全局变量max比较,最小的跟全局变量min比较,整个数组比较完后则得出序列中最大元素和最小元素

 

算法实现的伪代码

算法cut( int arr[ ],  int first, int  end )

输入:待选数组、数组首位下标、数组末位下标

输出:最大数和最小数

  1. mid = (first +end ) /2
  2. if(一个数或者是两个数作比较)
  3.     比较compare( arr,first,end )传出来的数组里的两个数与max和min的大小
  4.     较大的数比max大则将其赋值到max中
  5.     较小的数比min小则将其赋值到min中
  6. cut(arr,first,mid)
  7. cut(arr,mid+1,end)

 

实现代码

public class Main {
    static int max = 0,min = 0;

    public static void main(String[] args) {
        int[] arr = {5, 4, -2, 3, 6, 1, 7,1,2,3,4,5,6,6,7,8,1,3,4,2,2,4,3,345345,3,345,53,-231231,423};
        max = arr[0];
        min = arr[0];
        cut(arr, 0, arr.length - 1);
        System.out.println("MAX:"+max);
        System.out.println("MIN:"+min);
    }

    public static void cut(int[] arr, int first, int end) { //递归分割
        int mid = (first + end) / 2;
        if (end - first == 1 || end - first == 0) { //分割成一个数或者两个数
            int[] mm;
            mm = compare(arr, first, end); //接收两个数大小比较的结果
            if(arr[mm[0]]>max)
                max = arr[mm[0]];
            if(arr[mm[1]]<min)
                min = arr[mm[1]];
        } else {   //前半段和后半段递归
            cut(arr, first, mid);
            cut(arr, mid + 1, end);
        }
    }

    public static int[] compare(int[] arr, int index1, int index2) { //对比然后排序,大的放前面,小的放后面,然后返回数组
        int[] maxmin = new int[2];
        if (arr[index1] > arr[index2]) {
            maxmin[0] = index1;
            maxmin[1] = index2;
        } else {
            maxmin[1] = index1;
            maxmin[0] = index2;
        }
        return maxmin;
    }
}

 

写得不好,多请谅解!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个关于编程的问题。以下是函的代码: void findMinMax(int arr[], int n, int& max, int& min) { max = arr[]; min = arr[]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } } 这个函接受一个整数组、组的大小以及两个引用形参,用于存储最大值和最小值。函遍历整个组,找到最大值和最小值,并将它们存储在传入的引用形参。 ### 回答2: 可以编写一个函,使用引用形参来求n个整数最大数最小。函的基本思路是通过遍历整数组,找到其最大值和最小值,并将结果通过引用形参返回给调用者。 以下是一个示例代码: ```cpp #include <iostream> #include <algorithm> void FindMaxAndMin(const int* arr, int n, int& maxNum, int& minNum) { maxNum = arr[0]; // 假设第一个元素最大值 minNum = arr[0]; // 假设第一个元素最小值 for(int i = 1; i < n; i++) { if(arr[i] > maxNum) { maxNum = arr[i]; } else if(arr[i] < minNum) { minNum = arr[i]; } } } int main() { int arr[5] = {10, 5, 8, 3, 6}; int maxNum, minNum; FindMaxAndMin(arr, 5, maxNum, minNum); std::cout << "最大数:" << maxNum << std::endl; std::cout << "最小:" << minNum << std::endl; return 0; } ``` 在上述代码,`FindMaxAndMin` 函接收一个整数组 `arr`,长度 `n`,以及两个引用形参 `maxNum` 和 `minNum`,用于存储最大值和最小值。 函首先假设第一个元素最大值和最小值,然后通过遍历组来比较其他元素与当前最大值和最小值的大小关系,更新最大值和最小值。 在 `main` 函,我们声明一个整数组,调用 `FindMaxAndMin` 函,并输出计算得到的最大数最小输出结果为: ``` 最大数:10 最小:3 ``` 这证明了函正确地找到了最大值和最小值。 ### 回答3: 编写一个函,求n个整数最大数最小使用引用形参。 函的原型可以是:void findMinMax(const int* arr, int n, int& max, int& min)。 函的实现如下: ```cpp #include <iostream> void findMinMax(const int* arr, int n, int& max, int& min) { if (n == 0) { // 如果组为空,则返回0 max = 0; min = 0; return; } max = arr[0]; // 假定第一个最大值 min = arr[0]; // 假定第一个最小值 for (int i = 1; i < n; i++) { if (arr[i] > max) { // 如果当前字比最大值还大,则更新最大值 max = arr[i]; } if (arr[i] < min) { // 如果当前字比最小值还小,则更新最小值 min = arr[i]; } } } int main() { int arr[] = {3, 1, 5, -2, 7}; int n = sizeof(arr) / sizeof(arr[0]); int max, min; findMinMax(arr, n, max, min); std::cout << "最大值为:" << max << std::endl; std::cout << "最小值为:" << min << std::endl; return 0; } ``` 这个程序,我们定义了一个名为`findMinMax`的函,它接受一个整数组(以指针形式传入),组的长度n,以及两个引用形参max和min。函的作用是找到最大值和最小值,并通过引用参返回给调用者。 在函,我们首先处理组为空的情况,然后假定第一个最大值和最小值。接下来,我们遍历整个组,比较每个字与当前最大值和最小值的大小,并根据需要更新相应的值。 在主函,我们定义一个整数组arr并初始化它,然后计算组的长度n。接下来,我们定义两个整数变量max和min,用于存储结果。最后,我们调用`findMinMax`函,并打印最大值和最小值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值