【深基9.例4】求第 k 小的数#洛谷(MLE)

文章介绍了如何使用分治思想(如快速排序的变体)解决给定一组大整数找到第k小数的问题,但提到原始代码在处理大规模数据时会超出内存限制。作者寻求优化方法以避免内存溢出问题。

题目描述

输入 nnn1≤n<50000001 \le n < 50000001n<5000000nnn 为奇数)个数字 aia_iai1≤ai<1091 \le a_i < {10}^91ai<109),输出这些数字的第 kkk 小的数。最小的数是第 000 小。

请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。

输入格式

输出格式

样例 #1

样例输入 #1

5 1
4 3 2 1 5

样例输出 #1

2
n,m=map(int,input().split())
mapp=list(map(int,input().split()))
mapp.sort()
print(mapp[m])

请添加图片描述
这样子写,超内存认了。但是我用分治思想,也就是快排的变形,写出来还是超内存

def qsort(begin,end):
    global mapp,m
    left = begin
    right = end
    value_mid=mapp[int((left+right)/2)]
    while left<=right:
        while mapp[right] > value_mid:
            right -= 1
        while mapp[left] < value_mid:
            left += 1
        if left <= right:
            flag = mapp[left]
            mapp[left] = mapp[right]
            mapp[right] = flag
            left += 1
            right -= 1
    if m<=right:
        qsort(begin,right)
    elif left<=m:
        qsort(left,end)
    else:
        print(mapp[right+1])
        return 0


if __name__=="__main__":
    n, m = map(int, input().split())
    mapp = list(map(int, input().split()))
    qsort(0, n - 1)

请添加图片描述
和快排的思想一样,每一步都把对照参照值,数大的放在右边,数小的放在左边。然后和m进行比较,如果比m大就递归左边的部分,如果小就递归右边的部分。最后数列分成三部分。分别是左边小的,中间一样的,以及右边大的。最后可以得到第m小的数。但是还是超了。不理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

直接AC好吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值