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];
}
相关推荐
zander2586 分钟前
114. 二叉树展开为链表
数据结构·链表·深度优先
乐观勇敢坚强的老彭21 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光23 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
变量未定义~26 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗29 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
王维同学35 分钟前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表
LONGZETECH37 分钟前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
code_pgf39 分钟前
C++ 工程架构设计规范
c++·机器人
自学小白菜39 分钟前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
C++ 老炮儿的技术栈1 小时前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘