一种特别适用的数字分区函数,分享一下

来源:互联网 发布:多功能数据擦除机 编辑:程序博客网 时间:2024/04/29 11:16


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

0 0
原创粉丝点击