1045 快速排序 (25 分) python

这道题一开始看错了题目,以为是主元(左边都小于主元,右边都大于主元)或者(左边都大于主元,左边都小于主元)两种情况,没想到其实只需要解第一种情况就够了,这样其实简单很多。但是这道题用python写很慢,不能暴力解,需要将算法优化.
int比eval好!!
这是第一遍写的代码

num=eval(input())
text=input().split()
lis=[text[0],text[-1]]
for x in range(1,num-1):
    xiao=da=False
    key=True
    for y in text[0:x]:
        if y<text[x]: 
            xiao=True
        else:
            da=True
        if xiao and da:
            break
    else:
        if xiao:
            copy=text[x+1:]
            min_num=min(map(eval,copy))
            if min_num<eval(text[x]):
                    key=False
        if da:
            copy=text[x+1:]
            max_num=max(map(eval,copy))
            if max_num>eval(text[x]):
                    key=False
        if key:
            lis.append(text[x])
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))
****
#这是第二遍
#但这样显然不行,经过算法优化后,最后得到
num=eval(input())
text=input().split()
text=list(map(eval,text))
lis=[]
for x in range(0,num):
    key=True
    for y in text[:x]:
        if y>text[x]: 
            key=False
        if not key:
            break
    else:
        for p in text[x+1:]:
            if p<text[x]:
                 key=False
        if key:
            lis.append(str(text[x]))
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))

```python
num=eval(input())
text=input().split()
text=list(map(int,text))
text_copy=sorted(text,reverse=False)
lis=[]
max=0
for p in range(0,num):
    if text[p]>max:
        max=text[p]
        if text[p]==text_copy[p]:
            lis.append(str(text[p]))
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))

代码分析,第二行代码存在大量无效重复的比较,有点类似于冒泡排序中的无效比较,于是用max变量,并迭代故可大大减少无效比较。另外一个优化点是发现,位置相同,这没有什么好说的

这些引用提供了三种不同的方法来解决题目1045 快速排序。这道题目要求你找到一个数列中所有满足以下条件的数:它比它前面的所有数都大,比它后面的所有数都小。这些数被称为“主元素”。这些方法都是使用Python编写的快速排序算法来解决这个问题。 方法一使用了一个计数器来计算主元素的数量,并使用一个列表来存储所有的主元素。它遍历整个列表,对于每个元素,它检查它是否是主元素。如果是,它将计数器加1,并将该元素添加到列表中。最后,它打印出计数器和列表中的所有元素。 方法二使用了一个类似于方法一的计数器和列表,但是它使用了一个排序后的列表来检查每个元素是否是主元素。它遍历整个列表,对于每个元素,它检查它是否等于排序后的列表中的相应元素。如果是,它将计数器加1,并将该元素添加到列表中。最后,它打印出计数器和列表中的所有元素。 方法三使用了一个类似于方法二的排序后的列表,但是它使用了一个循环来检查每个元素是否是主元素。它遍历整个列表,对于每个元素,它检查它是否大于之前的最大值。如果是,它将该元素添加到结果列表中,并将最大值更新为该元素。否则,它遍历结果列表中的元素,从后往前,删除所有大于等于该元素的元素。最后,它打印出结果列表的长度和所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值