1.思想:
-
取一个参考值,让序列所有的元素排序后,左侧子序列的值都比参考值小,右侧子序列的值都比参考值大。
-
分别对左侧和右侧的子序列做1中的递归操作。
基于上述思想,常用的实现方法有两种,一种是简单、容易理解的Lomuto scheme,另一种是效率更高的Hoare scheme。下面的代码参考自维基百科的伪代码实现,不清楚的可以移步维基,仔细研究。
2.Lomuto partition scheme:
《Programming Pearls》and 《Introduction to Algorithms》都采用这种框架。这个框架通常选择最后一个元素作为pivot
,设置游标i
,使用j
作为索引遍历数组,保证游标i
左侧的元素都<= pivot
,右侧的元素全都>pivot
。
Python Implementation-1
# Segment 1
def partition(array, l, r):
pivot = array[r]
i = l - 1
for j in range(l, r):
if array[j] <= pivot:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i + 1]