# 原理:先选择一个数,进行排序,使得左边数比它小,右边的数比它大 # 如何实现,想象两个指针,分别从右往右走,从左往右走 # 先从最右边开始找,如果大的话就继续向左找,当比选择的数小,就让左指针对应的数等于右指针的数,此时两个数一样 # 然后从左往右找,如果小的话就继续往右找,如果大的话,就将上一步的右指针对应的数等于此时左指针对应的数。 # 然后再从右边刚才停下来的位置开始找,找到了再从左边开始找 # 直到使得左边的数比选择数小,右边比选择的数大 import random def partition(data, left, right): # 先找个变量把值存起来 tmp = data[left] while left < right: # 如果left小于right,并且右边的数比选择的数大,那么继续往左走 while left < right and data[right] >= tmp: right -= 1 # 如果右边的数比选择的数小,就让左指针对应的数等于右指针对应的数 data[left] = data[right] # 如果left小于right,并且左边的数比选择的数小,那么继续往右走 while left < right and data[left] <= tmp: left += 1 # 如果左边的数比选择的数大,就让右指针对应的数等于左指针对应的数 data[right] = data[left] # 完毕之后,肯定会多出来一个重复的值 # 我们还有换回去 data[left] = tmp return left def quick_sort(data, left, right): if left < right: # 找到mid,也就是我们选择的值,左边都比它小,右边的都比它大 mid = partition(data, left, right) # 然后递归,按照相同的方式对两部分再排序,直到顺序全部排好 quick_sort(data, left, mid-1) quick_sort(data, mid+1, right) arr = list(range(20)) random.shuffle(arr) print(arr) # [0, 7, 18, 15, 12, 2, 16, 14, 19, 4, 11, 13, 17, 5, 3, 10, 6, 1, 9, 8] quick_sort(arr, 0, len(arr)-1) print(arr) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]