PTA基础编程题目集-6-11 求自定类型元素序列的中位数(简单解法)


大概是最简单并且最优的解法?一般都是对数组进行排序之后选出中位数,但是其实只要找到最中间的数,中位数两边的数字是没有必要排序的

算法大致步骤:首先选定一个数,假定为中位数,在边界里遍历其他数字,把比它小的扔到左边,比它大的扔到右边,遍历一次之后,如果这个数刚好是数组的中位数就返回结果,如果这个数在中位数的左边,记录该位置为左边界,往右边找中位数,假定右边第一个数是中位数,重复遍历过程,如果在中位数的右边,记录该位置为右边界,假定左边第一个数是中位数,重复以上过程直到找到中位数

cpp 复制代码
ElementType Median( ElementType A[], int N ){
  ElementType t;
  int i=0;
  int k=1;
  int min=0;
  int max=N-1;
  while(1){
    for(int j=i+k;j>=min&&j<=max;j+=k){
      if(A[i]*k>A[j]*k){
        t=A[j];
        for(int r=j;r*k>i*k;r-=k){
          A[r]=A[r-k];
        }
        A[i]=t;
        i+=k;
      }
    }
    if(i==N/2){
      break;
    }
    if(i<N/2){
      i++;
      k=1;
      min=i;
    }
    if(i>N/2){
      i--;
      k=-1;
      max=i;
    }
  }
  return A[i];
}
相关推荐
NashSKY14 小时前
EM 算法完整推导与本质剖析
算法·机器学习·概率论
eggrall14 小时前
Linux进程信号——像收快递一样理解 Linux 信号
linux·开发语言·c++
‎ദ്ദിᵔ.˛.ᵔ₎14 小时前
c++ 11左值和右值
c++
foundbug99914 小时前
MATLAB实现:基于图像对比度和波段相关性的高光谱波段选择算法
开发语言·算法·matlab
Hical_W14 小时前
C++ Web 框架性能实测(Benchmark)
c++·开源
嘿嘿嘿x315 小时前
Linux-实践
linux·运维·算法
lzh2004091915 小时前
手撕线程池:巩固Linux线程知识
linux·c++
Godspeed Zhao15 小时前
从零开始学AI14——最大似然估计与对数损失函数
算法·逻辑回归·最大似然
basketball61615 小时前
C++ 命名空间知识点总结:从入门到合理设计
开发语言·c++