中位数(第k大数)快速求法

本文介绍了如何快速求解中位数,包括排序法、快排筛选法以及处理两个有序序列的中位数问题。此外,还探讨了在动态序列中查找中位数的方法,如插入排序、二叉排序树、红黑树以及维护堆的方法,并提供了具体代码实现。
摘要由CSDN通过智能技术生成

本文为twenz根据个人经验整理,转载请注明来源,谢谢!

 

中位数即为一系列数中的大小在中间位置的数,快速找中位数的有效方法有:

1.排序法:先对数组进行排序,时间复杂度为O(nlogn),然后选择中间的数

2.快排的筛选法(类似于找第k大的数):思想是选定一个数,找比它大的数和小的数,然后根据数量再在大的部分或者小的部分循环递归找,时间复杂度应该为O(n)

 

如果给定两个有序的系列,需要查找他们共同的中位数,时间复杂度又会是多少呢?

1. 直接对两个有序系列进行逐个元素比较,时间复杂度为O(m+n)

2. 采用二分查找(类似于找第k大点),先以一个序列的基准点(二分来确定)来在另外一个系列中二分查找,再不断更新两系列的上下界限,时间复杂度应该在O(logm*logn). 下面是一个程序的基本框架,不一定正确,只是提供架构思想,待以后碰到类似问题我将更新该代码:

double findMid(int pm,int m)
{
    if(pm == 0 || pm == m){
        if(m%2)return a[m/2]*1.0;
        else return (a[m/2]+a[m/2-1])/2.0;
    }
    int low1=0,up1=pm-1,low2=pm,up2=m-1,mid1,mid2,num;
    while(low2<=up2){
        mid2=(low2+up2)/2;
        while(low1<=up1){
            mid1=(low1+up1)/2;
            if(a[mid1]<=a[mid2])low1=mid1+1;
            else up1=mid1-1;
        }
        num = mid1+(mid2-pm);
        if(a[mid1]<=a[mid2]){
            num +=1;
            if(num == (m-1)/2)break;
            else if(num < (m-1)/2){
                low2=mid2+1;
                up2=m-1;
                low1=mid1+1;
                up1=pm-1;
            }
            else{
                low2=pm;
                up2=mid2-1;
                low1=0;
                up1=mid1-1;
            }
        }
        else{
            if(num =&#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值