AcWing 算法基础课学习记录(Python,备战蓝桥杯)

10月18日 day1

acwing785快速排序


def quick_sort(q,l,r):
    #当 l >= r 时 递归结束 因为 l = r 区间为1
    if l >= r:
        return
    
    i = l - 1 #将左指针指向l的左侧
    j = r + 1 #将右指针指向r的左侧
    x = q [(l + r) // 2]  #选择一个用于划分区间的值  选择中间第一个最后一个随机值都可以的
    
    while i < j: #先向左移动一次i;目的:交换i和j的值后不需要单独移动一次i和j 
        i += 1
        while q[i] < x: # 当i指向的值不小于x的时候,停止循环
            i += 1
            
        j -= 1
        while q[j] > x: # 当j指向的值不大于x的时候,停止循环
            j -= 1
        
        if i < j: # 如果两个指针还没有相遇
            q[i],q[j] = q[j],q[i]
    
    # 递归处理子区间        
    quick_sort(q,l,j)
    quick_sort(q,j + 1,r)


n = int(input())
q = list(map(int,input().split()))  #列表输出

quick_sort(q,0,n-1)

print(' '.join(list(map(str, q)))) # 将列表中的元素转换为字符串,并使用空格连接起来

acwing 786

找第k个数不用递归处理两次,一次就够了

n, k = map(int, input().split())
a = list(map(int, input().split()))

def quick_select(a, l, r, k):
    if l >= r:
        return a[l]
    x = a[l + r >> 1]
    i = l - 1
    j = r + 1
    while i < j:
        i += 1
        while a[i] < x:
            i += 1

        j -= 1
        while a[j] > x:
            j -= 1

        if i < j:
            a[i], a[j] = a[j], a[i]
    # s1是元素的数量,j与l是下标,如果j=2,l=0,共有3个元素,这就需要+1了
    length = j - l + 1 # 左半区间的区间长度
    if k <= length:
        return quick_select(a, l, j, k)
    else:
        return quick_select(a, j+1, r, k-length)

res = quick_select(a, 0, n-1, k)
print(res)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值