一種錯誤的方法
通常的、沒有經過充分考慮的選擇是將第一個元素做為"基准“。如果輸入書隨機的,那么這是可以接受的,但是如果輸入是預排序的或是反序的,那么這樣的”基准“就是一個劣質的分割,因為所以的元素不是被划入S1就是被划入S2。實際上,如果第一個元素用作”基准“而且輸入是預先排序的,那么快速排序花費的時間將是二次的,可是實際上卻沒干什么事,因此,使用第一個元素作為”基准“是絕對糟糕的。
一種安全的方法
一種安全的方法是隨機選取”基准“。這種策略是非常安全的,除非隨機生成器有問題,但是隨機數的生成一般是昂貴的,減少不了算法其余部分的平均運行時間。
三數中值分割法
一組N個數的中值是第[N/2]個最大的數。”基准“的最好選擇是數組的中值。但是這很難算出,且減慢快速排序的速度。這樣的中值的估計量可以通過隨機選取三個元素並用它們的中值作為”基准”而得到。實際上,隨機性並沒有多大的幫助,因此一般的做法是使用左端、右端和中心位置上的三個元素的中值作為“基准”。
實現三數中值分割方法
ElementType Median3(ElementType A[],int Left,int Right)
{
int Center = (Left + Right) / 2;
if(A[Left] > A[Center])
Swap(&A[Left],&A[Center]);
if(A[Left] > A[Right])
Swap(&A[Left],&A[Right]);
if(A[Center] > A[Right])
Swap(&A[Center],&A[Right]);
Swap(&A[Center],&A[Right - 1]);
return A[Right - 1];
}