一種特別適用的數字分區函數,分享一下


試想一下如果存在一個函數,能夠實現對任意的數組,選取一個數字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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章