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


试想一下如果存在一个函数,能够实现对任意的数组,选取一个数字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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值