Python之快速排序实现

快速排序

1. 在列表数据中随机找到一个基数;

2. 将列表的第一个数的下标设置为左标记(left),列表的最后一个数的下标设置为右标记(right);

3. 先执行右标记(right),寻找比基数小的数;

4. 当右标记(right)找到比基数小的数时,将右标记处的数据和左标记处的数据进行交换;

5. 再执行左标记(left),寻找比基数大的数;

6. 当左标记找到比必输大的数时,将左标记处的数据与右标记处的数据进行交换;

7. 当左标记和右标记指向同一位置时,将基数放置到此处;

8. 经过一次循环,已经将基数左右两边的数据分开了,左边的数据都比基数小,右边的数据都比基数大。

9. 将分开的数据再次进行快速排序即可。

代码实现

1. 这里将基数设置为列表的第一个数

# --- coding: utf-8 ---
# @Time    : 2020/4/5 8:20
# @Author  : Chester
# @Email   : 735936738@qq.com
# @File    : 1.py
# @Software: PyCharm

def query_sort(lists, left, right):
    if left >= right:   # 判断传递的数据是否正确
        return

    pivot = lists[left]     # 确定基数
    start = left            # 确定左标记
    end = right             # 确定右标记

    while start < end:
        # 开始循环
        while start < end and lists[end] >= pivot:
            '''
                先从右标记开始执行,寻找比基数小的数
            '''
            end -= 1
        # 当循环结束时,表示找到了比基数小的数,将左标记的值和右标记的值进行交换
        lists[start] = lists[end]

        while start < end and lists[start] <= pivot:
            '''
                再开始执行左标记,寻找比基数大的数
            '''
            start += 1
        # 当循环结束时,表示找到了比基数大的数,将左标记的值和右标记的值进行交换
        lists[end] = lists[start]
    # 当外层大循环结束时,表示左右标记指向了相同的位置,所以将基数的位置换过去
    lists[end] = pivot
    # 当一次循环执行结束后,基数的左面全都是比基数小的数,基数的右面全都是比基数大的数
    # 将左边的列表进行快速排序
    query_sort(lists, left, end - 1)
    # 将右边的列表进行快速排序
    query_sort(lists, end + 1, right)
return lists if __name__ == '__main__': my_list = [0, 34, 123, 456, 2, 312, 43, 6] print('快速排序前的列表:') print(my_list) print('快速排序后的列表:') print(query_sort(my_list, 0, len(my_list) - 1))

 代码详解

这层循环是为了实现右标记移动,并且寻找比基数小的数,当寻找到比基数小的数时,循环就不会在进行了。

        while start < end and lists[end] >= pivot:
            end -= 1

这层循环是为了实现左标记移动,并且寻找比基数大的数,当寻找到比基数大的数时,循环就不会在进行了。

        while start < end and lists[start] <= pivot:
            start += 1
原文地址:https://www.cnblogs.com/chao666/p/12635996.html