求第K大数的递归函数方法

 对于求第K大元素,也可以应用到求中位数.

以下也是基于求中位数对该函数进行演示。

主要思路:

先从数组左边扫描,如果发现了比e小的元素则暂停;再从数组右边扫描,遇到大于等于e的元素则暂停。此时左右两个暂停点的元素是错位的,把他们交换一下。然后从左右暂停点开始重复上述步骤,直到左右扫描在中间某处相会。此时相会的位置就是基准e把两个集合分开的位置,把e换到这个位置上,S1中元素就被放在e的左边,S2中的元素就被放在e的右边

#include <stdio.h>

void Swap(int* x, int* y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int FindKthLargest(int S[], int K, int Left, int Right)
{
    int e = S[Left]; //取第一个元素为基准
    int L = Left, R = Right;

    while (1) //将序列中比基准大的一道基准左边,小的移到右边
    {
        while ((Left <= Right) && (e <= S[Left]))
            Left++;
        while ((Left < Right) && (e > S[Right]))
            Right--;
        if (Left < Right)
            Swap(&S[Left], &S[Right]);
        else
            break;
    }
    Swap(&S[Left - 1], &S[L]);                    //将基准换到两集合之间
    if ((Left - L - 1) >= K)                      //(Left-L-1)表示了集合S1的大小
        return FindKthLargest(S, K, L, Left - 2); //在集合S1中查找
    else if ((Left - L - 1) < K - 1)              //在集合S2中查找
        return FindKthLargest(S, K - (Left - L - 1) - 1, Left, R);
    else
        return e; //找到了,返回e
}

int Median(int S[], int N)
{
    return FindKthLargest(S, (N + 1) / 2, 0, N - 1);
}

int main(void)
{
    int a[] = { 3, 5, 4, 7, 2, 1, 6 };//示例数组
    int i;
    i = Median(a, 7);
    printf("中位数为:%d\n", i);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brepot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值