5.快速排序

# 原理:先选择一个数,进行排序,使得左边数比它小,右边的数比它大
# 如何实现,想象两个指针,分别从右往右走,从左往右走
# 先从最右边开始找,如果大的话就继续向左找,当比选择的数小,就让左指针对应的数等于右指针的数,此时两个数一样
# 然后从左往右找,如果小的话就继续往右找,如果大的话,就将上一步的右指针对应的数等于此时左指针对应的数。
# 然后再从右边刚才停下来的位置开始找,找到了再从左边开始找
# 直到使得左边的数比选择数小,右边比选择的数大
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]

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9352423.html