获取数组中最大3个元素的最有效方法

时间:2018-10-09 04:11:52

标签: java algorithm sorting

已为我提供了一个元素数组和一个内置函数,该函数可以一次对5个元素进行排序。如何仅使用此函数来获取数组的最大3个元素,且对该函数的调用次数最少?

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

当同一组中出现最高和第二高的值时,此方法将失败。有更好的方法吗?

5 个答案:

答案 0 :(得分:4)

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

可能会做得比我素描的要好。假设您有25个元素。对于每5个一组,找到三个最大的组。然后在nos之间。从每组1个中找到三个最大的。否也一样。每组2个,第2个。 3.现在我们可以推断出三个最大的总数将在三个最大的否定之中。 1,两个最大的号码。 2和最大单号。 3,是六个元素,而不是9。因此,在对内置方法的另外两个调用中,而不是三个调用中,我们可以找到三个最大的元素。但是,将想法推广到原始数组的任何大小都会很复杂。

答案 1 :(得分:2)

#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;
}

非常简单的解决方案,以C方式实现。您可以轻松地将其转换为Java。扫描阵列为O(n)。由于要排序和搜索的小数组只有3个元素,因此我们可以轻松地使用线性搜索来避免重复,排序仅需进行2个比较。仍然是O(n)。

答案 2 :(得分:1)

这种方法怎么样。

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

答案 3 :(得分:0)

我不确定您正在使用什么工具,但是解决此问题的最简单方法是这样的。

:: trial example
set S3_COMMAND_STR=aws s3api put-object --bucket %S3_BUCKET% --key %S3_SEND_DIR%/%FILE_NAME% --body %SEND_FILE% --metadata md5chksum=%HashBase64% --content-md5 %HashBase64%

:: Uploaded Result Get
for /F %%A in ('%S3_COMMAND_STR%') do (set S3_RESULT=%%A) 

-- Return Command Error
File aws was not found.

我建议添加更多信息以获得更好的答案。

希望这会有所帮助。

答案 4 :(得分:-1)

#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);
}

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