1. list.sort()/reverse() & sorted()
sort()
方法是list列表对象的一个方法,可以直接对列表进行排序,不返回新的列表。属于“就地排序”。
x = [1, 2, 4, 3]
x.sort()
x
'''
[1, 2, 3, 4]
'''
x.sort(reverse=True)
x
'''
[4, 3, 2, 1]
'''
x.reverse()
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]
'''
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)