python实现快速排序
def quick_sort(a, l, r):
if l >= r:
return
m = par(a, l, r)
quick_sort(a, l, m-1)
quick_sort(a, m+1, r)
def partition(a, l, r):
x = a[r]
i = l - 1
index = l
while index < r:
if a[index] <= x:
i += 1
a[index], a[i] = a[i], a[index]
index += 1
a[i+1], a[r] = a[r], a[i+1]
return i+1
a = [4,1,3,2,5]
quick_sort(a, 0, 4)
print(a)
quick_sort
里面实现的快速排序思想,就是先获取索引m,其中数值小于a[m]的都排在了a[m]的左边,也就是索引小于m,大于a[m]的值都排在了a[m]的右边,也就是索引大于m。- 然后在递归得对左右两边分别调用quick_sort即可完成排序。当l>=r的时候,表示排序完成。
- 再来看
partition
函数:
- 首先将a[r]也就是数组最右边的值赋给x,这个值作为参考值,接下来将要把小于x的放在其左边,大于x的放在右边。
- i=l-1,i用来表示的是,小于x的值的最大索引,也就是说,小于x的值全部放在了小于i的索引之内。一开始的时候,我们不知道有多少小于x,因为i初始化为l-1。
- index=l表示从左到右依次遍历数组。
- 当发现,a[index]<x的时候,也就是找了一个小于参考值的元素,这个时候我们要将他放在已知小于x的值的右边。回头看一下,i表示的是小于x的最大索引,因此,需要把i+1,然后交换a[i+1]与a[index]。
- 跳出循环时,表示从l到r-1都排序完成了,小于x也就是a[r]的都放在了[l, i]区间内,大于x的都放在了[i+1, r-1]的区间内,这个时候,需要把x放在中间。即将a[i+1]与a[r]交换即可。
参考文献
- https://blog.csdn.net/razor87/article/details/71155518
- https://blog.csdn.net/u014597198/article/details/91395700?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase