Un Ordered Array中的前K个数字,不使用Sort或Linq OrderBy方法

时间:2014-09-05 17:05:39

标签: c# .net algorithm linq sorting

我只是对.Net中的内置函数进行binging / google搜索,以便从未分类数组中获取前K个数字/元素,而不使用linq顺序或排序方法

我可以通过实现选择算法来编写自己的TopK方法。

但我的主要内涵是“是否有任何使用选择算法的内置函数,如快速选择或堆。”

如果没有内置的TopK方法我想知道如何在不使用Sort和OrderBy方法的情况下使用Linq或.Net。

避免Sort和OrderBy的原因是“他们在内部遵循排序算法而不是选择算法”。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

void Main()
{
    var kth = 4;
    var arr = new int [] {5, 1, 3, 4, 2, 1};
    var val = getItem(arr, kth);

}   

int getItem(int[] items, int kth)
{
    if (kth == 0 || kth > items.Length)
    {
        throw new  IndexOutOfRangeException();
    }
    else if (items.Length == 1 && kth == 1)
    {
        // only 1 item so return it
        return items[0];
    }
    else if (items.Length == 2)
    {
        if (kth ==1)
        {
            // two items, 1st required so return smallest   
            return (items[0] <= items[1] ? items[0] : items[1]);
        }
        else
        {
            // two items, 2nd required so return smallest   
            return (items[0] <= items[1] ? items[1] : items[0]);
        }
    }
    var middleItem = (int)((items.Length)/2);
    var pivot = items[middleItem];

    var leftarr = items.Where(s => s < pivot).ToArray();
    if (leftarr.Length + 1 == kth)
    {
        //our pivot is the item we want
        return pivot;
    }
    else if (leftarr.Length >= kth)
    {
        // our item is in this array
        return getItem(leftarr, kth);
    }
    else
    {
        // need to look in the right array
        var rightarr = items.Where(s => s >= pivot).ToArray();
        return getItem(rightarr, kth - leftarr.Length);
    }
}