【Python】排序

1. list.sort()/reverse() & sorted()

  • sort()方法是list列表对象的一个方法,可以直接对列表进行排序,不返回新的列表。属于“就地排序”。
x = [1, 2, 4, 3]
x.sort() # reverse=False 默认升序排序
x
'''
[1, 2, 3, 4]
'''
    • 参数reverse
x.sort(reverse=True) # 降序排序
x
'''
[4, 3, 2, 1]
'''
# 相当于
x.reverse()
    • 参数key
x = [[2, 2]
    ,[1, 3]
    ,[3, 1]]
x.sort(key = lambda x: x[0])
'''
[[1, 3], [2, 2], [3, 1]]
'''
x.sort(key = lambda x: x[1])
'''
[[3, 1], [2, 2], [1, 3]]
'''
  • sorted()函数可以对任意可迭代对象进行排序,并返回一个新的已排序的列表。
x = [4, 3, 2, 1]
y = sorted(x) # 默认升序
y
'''
[1, 2, 3, 4]
'''
# 地址不同,证明生成新list
id(x) >>> 2007754927680
id(y) >>> 2007754928896

2. 就地排序

2.1 list.sort(key = ) 实现

  • .sort()直接对列表对象进行排序,排序前后列表对象的位置不变
  • list.sort(key = lambda x: x[0])
    list = [[1, 2], [3, 4]] 将元素的第一个值作为key进行排序

2.2 sorted() 实现 / list的指定范围内排序

  • sorted() 对任意可迭代对象进行排序,返回新list。
  • 将新list赋值给原list的一定范围,保证将排序好的序列赋值到原地址。
nums = [1,2,3,5,4,8,6,7]
id(nums)
'''
1897296510720
'''
nums[1:] = sorted(nums[1:])
nums
'''
[1, 2, 3, 4, 5, 6, 7, 8]
'''
id(nums)
'''
地址没变
1897296510720
'''
'''
全排序,nums地址没变,新排序好的序列赋值到nums原地址,属于就地排序
'''
nums[:] = sorted(nums)
'''
全排序,生成新的list对象,赋值给新的地址
'''
nums = sorted(nums)

2.3 排序算法

2.3.1 冒泡排序

for k in range(i+1,len(nums)-1):
            for j in range(k+1,len(nums)):
                if nums[k]>nums[j]:
                    nums[k],nums[j]=nums[j],nums[k]

2.3.2 归并排序

归并排序总结 非递归 & dfs

2.3.3 快速排序

AcWing 快排讲解

n = input()
nums = list(map(int, input().split()))

def dfs(left, right):
    if left >= right: return
    l = left - 1
    r = right + 1
    pivot = nums[(l + r) // 2]
    
    while l < r:
        while True:
            r -= 1
            if nums[r] <= pivot:
                break
        while True:
            l += 1
            if nums[l] >= pivot:
                break
        if l < r: nums[l], nums[r] = nums[r], nums[l]
        
    '''
    跳出循环后只有两种情况
    1. l和r指向同一元素,该元素必为pivot 如:[2, 3, 4] p=3,lr都指向3
                                                 lr
    2. l经过了r,在r后(y总视频例子) 如:[3, 2, 3] p=3,l指向最后一个3,r指向2
                                            r  l
    此时保证了[left, r]和[r + 1, right]是有序的
    '''
    dfs(left, r)
    dfs(r + 1, right)

dfs(0, len(nums) - 1)
print(*nums)
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值