快速排序(Quick Sort)
首先,选择列表中的第一个元素作为主元,然后选择两个指针。leftmark 选择主元后一个位置的元素,rightmark选择列表中最后一个元素。leftmark向右移动,当遇到比主元大的元素时停止;同时,rightmark向左移动,当遇到比主元小的元素时停止。如果此时 leftmark < rightmark,说明中间还有元素未处理,交换 leftmark 和 rightmark的位置,重复刚才的移动,直到 leftmark > rightmark。此时的rightmark就是主元最后在排好序的列表中要存放的位置,因为它停在一个比主元小的元素的位置上。此时交换主元和 rightmark位置上的元素即可。找到主元后,对主元左右的数组实行相同的操作。
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)
def partition(alist,first,last):
pivotvalue = alist[first]
leftmark = first + 1 #指定 leftmark的值
rightmark = last # 指定rightmark的值
done = False:
while not done:
# 满足条件后,leftmark右移一个位置
while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
leftmark = leftmark + 1
# 满足条件后,rightmark左移一个位置
while leftmark <= rightmark and alist[rightmark] >= pivotvalue:
rightmark = rightmark + 1
if rightmark < leftmark: # 循环结束
done
else: #循环没有结束,交换 leftmark 和 rightmark处的元素
alist[leftmark],alist[rightmark] = alist[rightmark],alist[leftmark]
alist[first],alist[rightmark] = alist[rightmark],alist[first] # 找到了主元的位置
return rightmark
Reference:
http://interactivepython.org/courselib/static/pythonds/SortSearch/TheQuickSort.html