试想一下如果存在一个函数,能够实现对任意的数组,选取一个数字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;
}