試想一下如果存在一個函數,能夠實現對任意的數組,選取一個數字pivot之後對該數組的數字進行分區,即得到基於參考pivot值的大小將數組分爲<pivot在左邊而>pivot在數組的右邊,或者反過來,對於這種分區,在獲取數組的基於某一元素獲取該數組的前k個小於或者大於它的數來說很有效果例如 4,1,2,5,3,6,0,8來說,若進行分區(4)則得到1,2,3,0,5,6,5,8基於算法的變形例如求出某個座標的周圍離遠點距離最小的k個座標點這對於遊戲的優化或者碰撞檢測來說避免了額外的開銷,所以分享一下,希望不吝糾正,提出寶貴意見
源碼:
int detachAraayByNum(int *a,int length)
{
int pivot = a[0];//默認選取開始的元素作爲基準值,可隨意選擇
int index = 1;//記錄比基準值大的一個元素的位置便於交換
for(int i=1;i<length;i++)
{
if(a[i]<=pivot)
{
if(index!=i)//否則進行判斷,交換,保證最小值在左側
{
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
index++;
}
//滿足小於基準值的時候i,index同步自增
}
a[0] = a[index-1];
a[index-1] = pivot;
//由於程序的目的在於得出最小的k個數,所以沒必要保持原來順序
//所以只需要進行簡單的交換,而避免移動元素帶來的開銷
return index;
}