快排,最小的k个数字,第k大的数字

快排

```python
def partition(array, l, r):
    p = l
    for i in range(l+1, r+1):
        if array[i] <= array[l]:
            p += 1
            array[i], array[p] = array[p], array[i]
    array[p], array[l] = array[l], array[p]
    return p

def quicksort(array, begin=0, end=None):
    if end is None:
        end = len(array) - 1
    def _quicksort(array, begin, end):
        if begin >= end:
            return
        pivot = partition(array, begin, end)
        _quicksort(array, begin, pivot-1)
        _quicksort(array, pivot+1, end)
    return _quicksort(array, begin, end)        
```

最小的k个数字

```python
def solution(nums: list, k: int)->list:  
    def quicksort(l: int, r: int) -> int:  
        p = l  
        for i in range(l, r):  
            if nums[i] <= nums[r]:  
                nums[p], nums[i] = nums[i], nums[p]  
                p += 1  
        nums[p], nums[r] = nums[r], nums[p]  
        if p > k:  
            return quicksort(l, p - 1)  
        elif p < k:  
            return quicksort(p + 1, r)  
        else:  
            return p  
    quicksort(0, len(nums)-1)  
    return nums[:k]  
  
  
if __name__ == '__main__':  
    nums=[1,3,5,4,2]  
    res = solution(nums, k=3)  
    print(res)
```

第k大的数字

```python
class Solution(object):
    def findKthLargest(self, nums, k):
        k = len(nums) - k
            
        def quickSelect(l, r):
            p = l
            for i in range(l, r):
                if nums[i]  <= nums[r]:
                    nums[p],nums[i] = nums[i],nums[p]
                    p += 1
            nums[p], nums[r] = nums[r], nums[p]
            if p > k: return quickSelect(l, p-1)
            elif p < k: return quickSelect(p+1, r)
            else: return nums[p]
            
        return quickSelect(0, len(nums)-1)    
```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值