pivot的选择主要有四种策略:
- 首元素法
- 尾元素法
- 三数取中法
- 随机法
首元素法
直接选择数组中第一个元素
int ChoosePivot(int* pData, int begin ,int end)
{
return pData[begin];
}
尾元素法
直接选择最后一个元素
int ChoosePivot(int* pData, int begin, int end)
{
return pData[end];
}
三数取中法(三个数取中间大小的值)
选取第一个元素,最后一个元素,最中间的元素,取其中位数作为pivot。例如,对于序列 1 3 7 2 4,
选取后的序列为 1 7 4,中位数为4,最终以4作为pivot。
int ChoosePivot(int* pData, int begin ,int end)
{
int middle = (begin + end) / 2;
if (pData[begin] >= pData[middle] && pData[begin] <= pData[end] ||
pData[begin] >= pData[end] && pData[begin] <= pData[middle])
return pData[begin];
else if (pData[middle] >= pData[begin] && pData[middle] <= pData[end] ||
pData[middle] >= pData[end] && pData[middle] <= pData[begin])
return pData[middle];
else
return pData[end];
}
随机数法
随机选择一个元素作为pivot
int ChoosePivot(int* pData, int begin ,int end)
{
int randIdx = (rand() % (end + 1 - begin)) + begin;
return pData[randId];
}