前言
怎么使用代码实现快速排序
方法1
创建两个列表分别保存有序值和无序值
代码如下:
def quickSort(nums):
n = len(nums)
if n <= 1:
return nums
left= []
right = []
piove = nums[0] #基准值
for item in range(1,n): # 第一个数不需要遍历
if nums[item] > piove:
right.append(nums[item])
else:
left.append(nums[item])
print(left,piove,right)
print('-'*30)
return quickSort(left) + [piove] + quickSort(right) # 函数调用,最后都是列表的相加
emp=[1,3,5,13,6,53,345,1,7,34,8,43,7,36,54324,57,4]
print(quickSort(emp))
# 这种方法容易理解但不是真正的快速排序,它开辟了额外的内存地址,对空间造成了浪费
方法2
挖坑和填坑法
代码如下:
def partition(nums, left, right):
pivot = nums[left] # 区域的第一个元素作为基准值
while left < right:
# 挖坑,填坑
while left < right and nums[right] > pivot:
right -= 1
nums[left] = nums[right]
while left < right and nums[left] <= pivot:
left += 1
nums[right] = nums[left]
nums[left] = pivot # 基准值的正确位置
return left
def quickSort(nums, left, right):
if left >= right:
return
# 分区 --> 分好区之后的基准值的索引
pivot_idx = partition(nums, left, right)
print(nums, pivot_idx)
# 左边的区域, left->pivot_idx-1
quickSort(nums, left, pivot_idx - 1)
# 右边的区域, pivot_idx+1->right
quickSort(nums, pivot_idx + 1, right)
test = [44, 12, 59, 36, 62, 43, 94, 7, 35, 52, 85]
quickSort(test, 0, len(test)-1)
print(test)
扩充:快速排序再次优化的几个可以考虑的方向
1.基准值的选取
(1)随机选取
(2)三数 mid
2.排序序列长度到一定大小后,改用插入排序
3.重复元素的处理
每次分割时,将与本次基准值相等的元素聚集在一起
(1)遇到相等的元素,放到区域的最左边或最右边
(2)分好区之后,相等的元素与基准值一边的元素进行交换
4.尾递归