如何分解是一个难题,因为如果基准元素选取不当,有可能分解
成规模为0和n−1的两个子序列。
例如,序列(30, 24, 5, 58, 18, 36, 12, 42, 39),第一次选取5作为
基准元素,第二次选取12作为基准元素……
基准元素选取有以下几种方法:
取第一个元素。
取最后一个元素。
取中间位置元素。
取第一个、最后一个、中间位置元素三者之中位数。
取第一个和最后一个之间位置的随机数k(low≤k≤high)
算法步骤:
1)取第一个元素作为基准元素pivot=R[low],i=low,j=high
2)从右向左扫描,找小于等于pivot的数,则R[i]和R[j]交换,i++
3)从左向右扫描,找大于pivot的数,则R[i]和R[j]交换,j− −
4)重复2)和3),直到i和j重合,返回该位置mid=i,该位置的数
正好是pivot元素
5)至此完成一趟排序。此时以mid为界,将原数据分为两个子序
列,左侧子序列元素都比pivot小,右侧子序列元素都比pivot大,
再分别对这两个子序列进行快速排序