我有一个唯一整数列表,我想对它们进行排序,以便下一个整数总是与其余整数尽可能远,这是可能的。
例如,{1,2,3,4,5,6,7,8,9} => {1,9,6,2,8,3,7,4,5}
而且我需要做得非常快。
目前,我正在这样做:
static double GetDistanceIndex(int value, List<int> others)
{
double result=0;
foreach (var other in others)
{
result += Math.Sqrt(Math.Abs(other - value));
}
return result;
}
static List<int> Sort(List<int> items, int initialValue)
{
items = items.ToList();
List<int> result=new List<int>();
lock (rnd)
{
while (true)
{
result.Add(initialValue);
items.Remove(initialValue);
if (items.Count == 0)
{
break;
}
Dictionary<double, List<int>> distances = new Dictionary<double, List<int>>();
foreach (var item in items)
{
var d = GetDistanceIndex(item, result);
if (!distances.ContainsKey(d))
{
distances[d] = new List<int>();
}
distances[d].Add(item);
}
var max = distances.Keys.Max();
var l = distances[max];
//if (l.Count == 1)
//{
// initialValue = l[0];
//}
//else
//{
initialValue = l[rnd.Next(l.Count)];
//}
}
}
return result;
}
但问题是,像这样实现的算法对于大型数组的运行速度非常慢。
任何人都可以向我建议一个更好的方法吗?
更新
这是一个更好的描述做了什么:
{1,2,3,4,5,6,7,8,9}=>
- 初始种子:1。真的,它可以是任何数字。我们可以选择 5,得到类似 {5,9,1,2,8,3,7,6,4}
- 从提供的数组中,9 是距离 1 最远的距离
- 因为在列表中,所有数字都与 1 和 9 等距,我们可以选择其中任何一个。我用rand来选择6。
- 现在我们正在寻找离 {1,9,6} 最远的数字。选择 2 是因为
abs(2-1)+abs(2-9)+abs(2-6)=12
and 大于abs(3-1)+abs(3-9)+abs(3-6)=11
orabs(4-1)+abs(4-9)+abs(4-6)=10
orabs(8-1)+abs(8-9)+abs(8-6)=10
or orabs(7-1)+abs(7-9)+abs(7-6)=9
orabs(5-1)+abs(5-9)+abs(5-6)=9
- ETC
更新 1
我正在使用此算法从固定数量的备选方案中选择尽可能不同的数字
更新 2
Dukeling 在他的回答中向我指出,{1,9,2,8,3,7,4,6,5} 也符合我的要求。这是真的,这是我的错误。我希望数字尽可能地间隔开,而 3d 数字非常接近第一个数字并不是我想要的。所以我正在更新距离函数以反映这一点