求数组中第K个最大的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数组中第K个最大的值相关的知识,希望对你有一定的参考价值。

参考技术A 那么有没有更好的方案?我们可以考虑从k入手。如果我们每次能够删除一个一定处于第k大元素之前的元素,那么需要进行k次。但是如果我们每次都能删除一半呢?可以利用A,B有序的信息,类似二分查找,也是充分利用有序。
假设A
和B
的元素个数都大于k/2,我们将A
的第k/2
个元素(即A[k/2-1])和B
的第k/2个元素(即B[k/2-1])进行比较,有以下三种情况(为了简化这里先假设k
为偶数,所得到的结论对于k
是奇数也是成立的):
-
A[k/2
-
1]
==
B[k/2
-
1];
-
A[k/2
-
1]
>
B[k/2
-
1];
-
A[k/2
-
1]
<
B[k/2
-
1];
如果A[k/2
-
1]
<
B[k/2
-
1]
,意味着
A[0]

A[k/2
-
1]
的元素一定小于
A+B
第k大的元素。因此可以放心的删除A数组中的这k/2个元素;
同理,A[k/2
-
1]
>
B[k/2
-
1];可以删除B数组中的k/2个元素;
当A[k/2
-
1]
==
B[k/2
-
1]
时,说明找到了第k大的元素,直接返回A[k/2
-
1]
或B[k/2
-
1]的值。
因此可以写一个递归实现,递归终止条件是什么呢?
-
A或B为空时,直接返回A[k-1]

B[k-1]
-
当k
=
1时,返回min(A[0],
B[0])
//第1小表示第一个元素
-
当A[k/2
-
1]
==
B[k/2
-
1]
时,返回A[k/2
-
1]
或B[k/2
-
1]

求数组中第二大的值

/*

所有c语言代码,都是在LoadRunner中运行;

*/
Action()
{
  int a[]={12,34,565,23,24,667,89,98};//定义一个int数组;
  int len;//记录数组元素个数;
  int max;//所求的最大值;
  int max_2;//第二大的值;
  int i;//循环变量;LoadRunnerg中,不能在for循环中定义变量;

  len = sizeof(a)/sizeof(int);//数组元素个数=数组所占字符数/数组元素类型所占字符数;
  max = a[0];
  for (i = 0;i < len;i ++) {
    if (max < a[i]) {
    max = a[i];
    }
  }
  lr_output_message("数组a[]的最大的值是==%d==",max);

  max_2 = a[0];
  for (i = 0;i < len;i ++) {
    if ((max_2 < a[i])&&(a[i] < max)) {
    max_2 = a[i];
    }
  }
  lr_output_message("数组a[]的第二大的值是==%d==",max_2);

  return 0;
}

 

===========================================================================================

运行结果

Action.c(21): 数组a[]的最大的值是==667==
Action.c(29): 数组a[]的第二大的值是==565==

===========================================================================================

 























以上是关于求数组中第K个最大的值的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 215数组中第k个最大的元素

求数组中第二大的值

excel里说的“第K个最大值”和“第K个最小值”指啥,啥意思,怎么计算。

215. 数组中的第K个最大元素

215. 数组中的第K个最大元素

如何查找无序数组中的Top n