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];
}
相关推荐
无名猿10 分钟前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期
007张三丰10 分钟前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
千千寰宇37 分钟前
[数据库系统] 数据库系统的设计原理研究
数据结构·数据库·database-opengemini/influxdb·database-dament/达梦
聪明蛋子哟44 分钟前
不仅仅是向量检索:结合知识图谱与Tool Calling的混合增强生成(Hybrid RAG)方案
人工智能·算法·知识图谱
Pniubi1 小时前
力扣55跳跃游戏(贪心)
算法·leetcode·游戏
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
xlq223221 小时前
全面复习4
c++
jyyyx的算法博客1 小时前
传球游戏【思维】
算法
FL16238631291 小时前
关于2026年南昌大学811信号与系统最后一题电路系统解题思路
算法
殷色玫瑰1 小时前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc