Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未使用Sort或Linq OrderBy方法的未排序数组中的前K个数_C#_.net_Algorithm_Linq_Sorting - Fatal编程技术网

C# 未使用Sort或Linq OrderBy方法的未排序数组中的前K个数

C# 未使用Sort或Linq OrderBy方法的未排序数组中的前K个数,c#,.net,algorithm,linq,sorting,C#,.net,Algorithm,Linq,Sorting,我只是在.Net中搜索内置函数,从未排序的数组中获取前K个数字/元素,而不使用linq order by或排序方法 另一种方法是通过实现选择算法来编写自己的TopK方法 但我的主要意图是“是否有使用快速选择或堆等选择算法的内置函数。” 如果没有内置的TopK方法,我想知道如何在不使用Sort和OrderBy方法的情况下使用Linq或.Net。 避免使用Sort和OrderBy的原因是“它们在内部遵循排序算法,而不是选择算法”。如果我错了,请纠正我。这个怎么样: void Main() {

我只是在.Net中搜索内置函数,从未排序的数组中获取前K个数字/元素,而不使用linq order by或排序方法

另一种方法是通过实现选择算法来编写自己的TopK方法

但我的主要意图是“是否有使用快速选择或堆等选择算法的内置函数。”

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

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

这个怎么样:

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);
    }
}
void Main()
{
var-kth=4;
var arr=newint[]{5,1,3,4,2,1};
var val=getItem(arr,kth);
}   
int getItem(int[]项,int kth)
{
if(kth==0 | | kth>items.Length)
{
抛出新的IndexOutOfRangeException();
}
else if(items.Length==1&&kth==1)
{
//只有1件,所以把它退回
退货项目[0];
}
else if(items.Length==2)
{
如果(kth==1)
{
//两件物品,第一件需要,所以返回最小的
退货(项目[0]=kth)
{
//我们的物品在这个阵列中
返回getItem(leftarr,kth);
}
其他的
{
//需要在正确的数组中查找
var rightarr=items.Where(s=>s>=pivot.ToArray();
返回getItem(rightarr,kth-leftarr.Length);
}
}

您不想使用吗?类似于OrderedBag或OrderedSet的东西。它的行为类似于优先级队列(或二进制堆)。非常自信.NET没有(公共的)堆实现。您必须自己编写。我已在上输入了一个功能请求,问题#同时,比较列表中每个项目并仅保留n个元素列表中前K个元素的foreach应该接近O(n)。类似方法的实现可以在以下位置找到: