Java 获取阵列中最大3个元素的最有效方法
我得到了一个元素数组和一个内置函数,可以一次对5个元素进行排序。如何仅使用此函数以最少的调用次数获取数组中最大的3个元素 我尝试过的方法是将数组分成5个组,对每个组应用函数,并对从每个组获得的最大值应用函数Java 获取阵列中最大3个元素的最有效方法,java,algorithm,sorting,Java,Algorithm,Sorting,我得到了一个元素数组和一个内置函数,可以一次对5个元素进行排序。如何仅使用此函数以最少的调用次数获取数组中最大的3个元素 我尝试过的方法是将数组分成5个组,对每个组应用函数,并对从每个组获得的最大值应用函数 当最高和第二高的人恰好出现在同一组时,这种方法就失败了。有更好的方法吗?因为您有内置的方法来对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个 这将有可
当最高和第二高的人恰好出现在同一组时,这种方法就失败了。有更好的方法吗?因为您有内置的方法来对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个
这将有可能做得比我所画的好一点。假设你有25个元素。每组5人,找出三个最大的。然后在每组的第一名中找出三个最大的。每组的2号和3号的情况相同。现在我们可以推断,三个最大的整体将位于三个最大的1号元素、两个最大的2号元素和单个最大的3号元素之间,即六个元素而不是9个元素。因此,我们可以在对内置方法的两次调用中找到三个最大的调用,而不是三次调用。不过,将想法推广到原始数组的任何大小都会很复杂。因为您有内置的方法对五个元素进行排序,我建议:对数组中的前五个元素进行排序。重复丢弃五个元素中最小的两个,替换为数组中的另外两个元素(两个尚未考虑的元素),然后再次对五个元素进行排序。最后,取五个中最大的三个
这将有可能做得比我所画的好一点。假设你有25个元素。每组5人,找出三个最大的。然后在每组的第一名中找出三个最大的。每组的2号和3号的情况相同。现在我们可以推断,三个最大的整体将位于三个最大的1号元素、两个最大的2号元素和单个最大的3号元素之间,即六个元素而不是9个元素。因此,我们可以在对内置方法的两次调用中找到三个最大的调用,而不是三次调用。不过,将这个想法推广到原始数组的任何大小都是复杂的。这个方法怎么样
这个方法怎么样
#包括
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);
}