• 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
  • 相关阅读:
    《小学四则运算练习软件》GUI
    小学四则运算练习软件项目报告
    速读《现代软件工程——构建之法》
    个人学期总结
    201571030102/201571030133《小学四则运算软件软件需求说明》结对项目报告
    201571030102软件工程结对项目
    201571030102小学生四则运算
    速读《现代软件工程----构建之法》有感
    个人学期总结
    201571030103/201571030105 《小学四则运算练习软件软件需求说明》结对项目报告
  • 原文地址:https://www.cnblogs.com/chao666/p/12635996.html
Copyright © 2020-2023  润新知