Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取阵列中最大3个元素的最有效方法_Java_Algorithm_Sorting - Fatal编程技术网

Java 获取阵列中最大3个元素的最有效方法

Java 获取阵列中最大3个元素的最有效方法,java,algorithm,sorting,Java,Algorithm,Sorting,我得到了一个元素数组和一个内置函数,可以一次对5个元素进行排序。如何仅使用此函数以最少的调用次数获取数组中最大的3个元素 我尝试过的方法是将数组分成5个组,对每个组应用函数,并对从每个组获得的最大值应用函数 当最高和第二高的人恰好出现在同一组时,这种方法就失败了。有更好的方法吗?因为您有内置的方法来对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个 这将有可

我得到了一个元素数组和一个内置函数,可以一次对5个元素进行排序。如何仅使用此函数以最少的调用次数获取数组中最大的3个元素

我尝试过的方法是将数组分成5个组,对每个组应用函数,并对从每个组获得的最大值应用函数


当最高和第二高的人恰好出现在同一组时,这种方法就失败了。有更好的方法吗?

因为您有内置的方法来对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个


这将有可能做得比我所画的好一点。假设你有25个元素。每组5人,找出三个最大的。然后在每组的第一名中找出三个最大的。每组的2号和3号的情况相同。现在我们可以推断,三个最大的整体将位于三个最大的1号元素、两个最大的2号元素和单个最大的3号元素之间,即六个元素而不是9个元素。因此,我们可以在对内置方法的两次调用中找到三个最大的调用,而不是三次调用。不过,将想法推广到原始数组的任何大小都会很复杂。

因为您有内置的方法对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个


这将有可能做得比我所画的好一点。假设你有25个元素。每组5人,找出三个最大的。然后在每组的第一名中找出三个最大的。每组的2号和3号的情况相同。现在我们可以推断,三个最大的整体将位于三个最大的1号元素、两个最大的2号元素和单个最大的3号元素之间,即六个元素而不是9个元素。因此,我们可以在对内置方法的两次调用中找到三个最大的调用,而不是三次调用。不过,将这个想法推广到原始数组的任何大小都是复杂的。

这个方法怎么样

  • 将数组分成5组
  • 对每组5个元素应用提供的排序方法
  • 从每个数组中获取前3个元素
  • 然后将每组中标识的3个元素合并到一个数组中
  • 现在重复步骤1到4,直到最终数组大小小于或等于5
  • 从最终数组中获取前3个元素

  • 这个方法怎么样

  • 将数组分成5组
  • 对每组5个元素应用提供的排序方法
  • 从每个数组中获取前3个元素
  • 然后将每组中标识的3个元素合并到一个数组中
  • 现在重复步骤1到4,直到最终数组大小小于或等于5
  • 从最终数组中获取前3个元素
  • #包括
    void sortThree(int res[3]){
    对于(int j=0;j<2;j++){
    if(res[j]>res[j+1])
    标准::交换(res[j],res[j+1]);
    }
    if(res[0]>res[1])std::swap(res[0],res[1]);//第二遍
    }
    布尔搜索(int src[],int n,int k){
    对于(int i=0;ires[0]&&!lsearch(res,3,arr[i])){
    if(arr[i]>res[0]){
    res[0]=arr[i];
    sortThree(res);
    }
    }
    }
    int main(int argc,char*argv[])
    {
    int arr[]={91,21,3,-4,5,2,1,90,9,11};
    int res[3];
    获取最大值(arr,10,res);
    对于(int i=0;i<3;i++)
    std::cout
    #包括
    void sortThree(int res[3]){
    对于(int j=0;j<2;j++){
    if(res[j]>res[j+1])
    标准::交换(res[j],res[j+1]);
    }
    if(res[0]>res[1])std::swap(res[0],res[1]);//第二遍
    }
    布尔搜索(int src[],int n,int k){
    对于(int i=0;ires[0]&&!lsearch(res,3,arr[i])){
    if(arr[i]>res[0]){
    res[0]=arr[i];
    sortThree(res);
    }
    }
    }
    int main(int argc,char*argv[])
    {
    int arr[]={91,21,3,-4,5,2,1,90,9,11};
    int res[3];
    获取最大值(arr,10,res);
    对于(int i=0;i<3;i++)
    std::cout
    #包括
    #包括
    int retmax(int*a、int n、int exc){
    int max=int_MIN;
    对于(int i=0;i max&&a[i]
    一个简单的O(n)解决方案。

    #包括
    #包括
    int retmax(int*a、int n、int exc){
    int max=int_MIN;
    对于(int i=0;i max&&a[i]

    一个简单的O(n)解决方案。

    虽然这是一个有趣的问题,但Stackoverflow并不是用来解决它的
    #include <iostream>
    
    
    void sortThree(int res[3]) {
       for(int j = 0; j < 2; j++) {
          if(res[j] > res[j+1])
             std::swap(res[j], res[j+1]);
    }
       if(res[0] > res[1]) std::swap(res[0], res[1]); // second pass
    }
    
    bool lsearch(int src[], int n, int k) {
      for(int i = 0; i < n; i++) {
        if(src[i] == k) return true;
      }
      return false;
    }
    
    void getThreeLargest(int arr[], int n, int res[3]) {
      res[0] = arr[0];
      res[1] = arr[1];
      res[2] = arr[2];
      sortThree(res);
      for(int i = 3; i < n; i++) {
        // if no repetition wanted
        // if(arr[i] > res[0] && !lsearch(res, 3, arr[i])) {
        if(arr[i] > res[0]) {
          res[0] = arr[i];
          sortThree(res);
        }
      }
    }
    
    int main(int argc, char *argv[])
    {
      int arr[] = {91,21,3,-4,5,2,1,90,9,11};
      int res[3];
      getThreeLargest(arr, 10, res);
      for(int i = 0; i < 3; i++)
        std::cout << res[i] << '\n';
      return 0;
    }
    
    #include<stdio.h>
    #include<limits.h>
    
    int retmax(int *a,int n,int exc){
    
        int max = INT_MIN;
        for(int i=0;i<n;i++){
            if(a[i] > max && a[i] < exc)
               max = a[i];
        }
    
        return max;
    }
    
    int main(){
    
        int a[]={32,54,12,43,98,45,87};
        int size = sizeof(a)/sizeof(a[0]);
    
        int x = retmax(a,size,INT_MAX);
        int y = retmax(a,size,x);
        int z = retmax(a,size,y);
    
        printf("%d %d %d",x,y,z);
    }