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