欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python实现快速排序

程序员文章站 2024-03-19 15:19:52
...

排序原理
1、设定一个分界值(数组最开始的数,切分后就是切分后数组的第一个数)
2、将大于等于分界值的数放到右边,小于分界值的放到左边
3、然后对左侧的数组和右侧的数组在继续分成左右两个部分


class Quick:

    def __init__(self):
        super(Quick, self).__init__()

    @staticmethod
    def sort(a):
        Quick.quick(a, 0, len(a)-1)

    @staticmethod
    def quick(a, start, end):
        if start >= end:
            return

        partition = Quick.partition(a, start, end)

        Quick.quick(a, partition, end)
        Quick.quick(a, start, partition-1)


    @staticmethod
    def partition(a, start, end):
    	# 快速排序的核心
        mid = start
        p1 = start + 1
        p2 = end
        
        while True:
			
			# 比较mid(分界值索引)和p1处的大小, mid 比 p1 大就继续循环,否则break
            while Quick.compare(a, mid, p1):
                # print(p1)
                if p1 == end:
                    break
                p1 += 1

			# 比较mid(分界值索引)和p1处的大小, mid 比 p2小就继续循环,否则break
            while Quick.compare(a, p2, mid):
                if p2 == start:
                    break
                p2 -= 1

			# 如果p2 > p1 就交换位置,(注意是p1和p2交换位置)
            if p2 > p1:
                Quick.exchange(a, p1, p2)
            else:
                break
            # print(p1, p2)
		# 到这一步,说明p1,p2 已经碰头了,p2和p1 已经将值都遍历了,没有大于mid的值,将mid 和 p2 交换位置,切分数组
        Quick.exchange(a, start, p2)
        return p1

    @staticmethod
    def exchange(a, i, j):
        temp = a[i]
        a[i] = a[j]
        a[j] = temp

    @staticmethod
    def compare(a, i, j):
        if a[i] >= a[j]:
            return True
        return False

if __name__ == '__main__':
    quick = Quick()
    t = [1, 3, 2, 4, 0, 6, 5, 7, 123, 1, 25, 3, 123, 5, 5, 2, 3, 5, 9, 12, 34, 231, 32, 12, 23]
    quick.sort(t)
    print(t)