python快速排序找第k大值_排序-快速排序(无序数组中寻找第K大值)

这篇博客介绍了如何使用Python实现快速排序算法,并通过两种不同的方法展示了快速排序的过程。此外,还详细解释了如何在无序数组中找到第K大值的方法,通过示例代码进行验证,确保算法的正确性。
摘要由CSDN通过智能技术生成

# -*- coding:utf-8 -*-

import random

def quick_sort(array):

"""快速排序 分冶法"""

if len(array) < 2:

return array

else:

mid_value = array[0] #

less_array = [i for i in array[1:] if i < mid_value]

great_array = [i for i in array[1:] if i >= mid_value]

new_array = quick_sort(less_array) + [mid_value] + quick_sort(great_array)

return new_array

def test_quick_sort():

q = list(range(10))

q.append(5)

random.shuffle(q)

sorted_q = sorted(q)

assert quick_sort(q) == sorted_q

#############################################

# 快速排序 第二种方法

#############################################

def quick_sort2(array, begin, end):

if end > begin:

pivod = partition(array, begin, end)

quick_sort2(array, begin, pivod - 1)

quick_sort2(array, pivod + 1, end)

return array

def partition(array, begin, end): # begin:数组开始下标 数组结束下标

pivod_index = begin

pivod = array[pivod_index]

left = pivod_index + 1 # 数组开始下标后一个起

right = end

while True:

while left <= right and array[left] < pivod:

left += 1

while left <= right and array[right] >= pivod:

right -= 1

if left > right:

break

array[left], array[right] = array[right], array[left]

array[pivod_index], array[right] = array[right], array[pivod_index]

return right

def test_quick_sort2():

a = list(range(10))

random.shuffle(a)

print(a)

sorted_a = sorted(a)

new_a = quick_sort2(a, 0, len(a) - 1)

print(new_a)

assert new_a == sorted_a

#############################################

# 无序数组中 寻找第K大的元素

#############################################

def find_k_value(array, begin, end, k):

index = partition(array, begin, end)

if len(array[index:]) == k:

return array[index]

elif len(array[index:]) > k:

return find_k_value(array, index + 1, end, k)

else:

return find_k_value(array, begin, index, k)

def test_find_k_value():

a = list(range(10))

random.shuffle(a)

print(a)

k_value = find_k_value(a, 0, len(a) - 1, 10)

print(k_value)

assert k_value == 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值