不使用Sort或LinqOrderBy方法的无序数组中的前K个数字
本文关键字:数组 数字 无序 Sort LinqOrderBy 方法 | 更新日期: 2023-09-27 18:20:52
我只是在谷歌上搜索.Net中的内置函数,从未排序的数组中获取前K个数字/元素,而不使用linq order by或sort方法。
另一种方法是,我可以通过实现选择算法来编写自己的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);
}
}