快速排序

215 阅读1分钟

快速排序

#/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
Create Time: 2020/10/27 11:00 PM
Author: ada
"""

def quickSort(alist):
	quickSortHelper(alist,0,len(alist)-1)


def quickSortHelper(alist,first,last):

	if first < last:
		splitpoint = partition(alist,first,last)
		quickSortHelper(alist, first, splitpoint-1)
		quickSortHelper(alist, splitpoint+1, last)


'''
以基准值为锚先分裂,左边小于基准,右边大于基准,再分解n个两半递归
比较难理解的parttion函数
理解parttion的关键主要是你要以两边都是动态的变动去看,两边都是跟基准值做比较,左标向右移动,一直移动到大于基准值,右标向左移动,一直移到小于基准值
如果两标相错就结束移动
否则左右标的值交换

直到右标>左标
把基准值赋给temp
再把右标赋给列表第一个值
最后把基准放到rightmark位置,再返回rightmark(splitpoint)

'''
def partition(alist,first,last):
	pivotvalue = alist[first]
	leftmark = first + 1
	rightmark = last

	done = False
	while not done:
		while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
			leftmark = leftmark + 1


		while rightmark >= leftmark and alist[rightmark]>= pivotvalue:
			rightmark = rightmark - 1

		if rightmark < leftmark:
			done = True
		else:
			temp = alist[leftmark]
			alist[leftmark] = alist[rightmark]
			alist[rightmark] = temp

	temp = alist[first]
	alist[first] = alist[rightmark]
	alist[rightmark] = temp

	return rightmark