三种快速排序的图示和python实现

基本快速排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        def quickSort(s, start, end):
            if start < end:
                index = basicSort(s, start, end)
                quickSort(s, start, index - 1)
                quickSort(s, index + 1, end)

        def basicSort(s, start, end):
            """
            基本的快速排序,i作为小于temp值和大于temp值的分界点。index<=i的值都是小于temp的值
            index > i 的元素都是大于等于temp的
            :param s:
            :param start: 闭区间
            :param end: 闭区间
            :return:
            """
            temp = s[start]
            j = start

            for i in range(start + 1, end + 1):
                # 如果i位置的元素小于temp,那就把它放在j+1的位置
                if s[i] < temp:
                    s[j + 1], s[j] = s[i], s[j + 1]
                    j += 1

            # 最后j指向的位置是一个小于temp的元素,可以将其和start位置的元素
            s[start], s[j] = s[j], s[start]
            return j

二路快速排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        def quickSort(s, start, end):
            if start < end:
                index = binSort(s, start, end)
                quickSort(s, start, index - 1)
                quickSort(s, index + 1, end)
        def binSort(s, start, end):
            """

            :param s:
            :param start:
            :param end:
            :return:
            """

            temp = s[start]
            i = start + 1
            j = end

            # 使用的全都是闭区间,闭区间范围[start+1,end]
            # 循环终止条件
            while True:
                # 利用短路条件,如果s[i] < temp在前就会报错
                while i <= end and s[i] < temp:
                    i += 1
                while j >= start + 1 and s[j] > temp:
                    j -= 1

                if i >= j:
                    break

                """
                s[i] >= temp 且  s[j] <= temp  
                所以值等于temp的元素,最终可能分布在两侧              
                """
                s[i], s[j] = s[j], s[i]
                i += 1
                j -= 1

            s[start], s[j] = s[j], s[start]
            return j

三路快速排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    def threeSort(self, s, start, end):  # 使用闭区间
        """
        :param s:
        :param start:
        :param end:
        :return:
        """
        if start > end:
            return

        temp = s[start]

        lt = start  # 小于temp的范围是 [start,lt-1]
        gt = end + 1  # 等于temp的范围是 [lt+1,gt-1]
        i = start + 1  # 大于temp的范围是[gt,r]

        # i到gt-1的数据,状态不明确

        while i < gt:
            if s[i] < temp:
                s[i], s[lt + 1] = s[lt + 1], s[i]
                lt += 1
                i += 1
            elif s[i] > temp:
                s[i], s[gt - 1] = s[gt - 1], s[i]
                gt -= 1
            else:
                i += 1

        s[start], s[lt] = s[lt], s[start]
        self.threeSort(s, start, lt - 1)
        self.threeSort(s, gt, end)
发布了85 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_37275456/article/details/103348299