Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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# 您知道如何取消列表或数组的排序吗?_C#_Algorithm_Sorting - Fatal编程技术网

C# 您知道如何取消列表或数组的排序吗?

C# 您知道如何取消列表或数组的排序吗?,c#,algorithm,sorting,C#,Algorithm,Sorting,我记得看到一个方法似乎是buble排序,在那里可以对项目进行反排序 例如,我尝试使用Random类显示从0到10的随机项。但我想这不是最好的选择 因此,我想为IEnumberable、List或array创建一个扩展,这可能是最好的方法。您正在寻找一个随机排列,随机重新排序的一个很好的例子是 这是一个。您可以使用linq var result = Enumerable.Range(0,10).OrderBy( n=> Guid.NewGuid() ) 这将为您提供从0到10(包括10)的

我记得看到一个方法似乎是buble排序,在那里可以对项目进行反排序

例如,我尝试使用Random类显示从0到10的随机项。但我想这不是最好的选择


因此,我想为IEnumberable、List或array创建一个扩展,这可能是最好的方法。

您正在寻找一个随机排列,随机重新排序的一个很好的例子是

这是一个。

您可以使用linq

var result = Enumerable.Range(0,10).OrderBy( n=> Guid.NewGuid() )

这将为您提供从0到10(包括10)的随机值:

int[]randomNumbers=Shuffle(可枚举的.Range(0,11),new Random()).ToArray();
公共静态IEnumerable Shuffle(此IEnumerable源,随机)
{
T[]list=source.ToArray();
int count=list.Length;
而(计数>1)
{
int index=random.Next(count--);
T temp=列表[索引];
列表[索引]=列表[计数];
列表[计数]=温度;
}
退货清单;
}

看起来像冒泡排序的算法是:

for i= 0:(len(x)-1):
    j = random(i,len(x)-1)
    swap(x[i],x[j])
假设random(a,b)返回一个随机整数c,使得a有趣的问题, 我建议离开工作linq:

IEnumerable<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random rnd = new Random();
list = list.Select(i => new { value = i, rank = rnd.Next(list.Count()) }).OrderBy(n => n.rank).Select(n => n.value);
IEnumerable list=新列表{1,2,3,4,5,6,7,8,9,10};
随机rnd=新随机();
list=list.Select(i=>new{value=i,rank=rnd.Next(list.Count())}).OrderBy(n=>n.rank.Select(n=>n.value);

您所说的0到10之间的项目可能重复?前10项?大小为10的列表?是的,我的意思是,要有一个元素为{0,1,2,…9}的数组,除了LINQ的
OrderBy
/
ThenBy
在引擎盖下使用快速排序,给它O(n log n)性能(平均情况),更不用说需要额外的空间了。“标准”洗牌算法是O(n),不需要额外的空间。不,永远不要使用这个@在L.B.中,OrderBy是稳定的,它不像列表上的排序方法那样有缺点。对于一个小序列的快速一次性洗牌,使用OrderBy并不可怕,但是一个更好的算法肯定会更具可伸缩性。这是一个非常糟糕的主意。guid不能保证是随机的,它们保证是唯一的。使用guid生成唯一标识符;除了这些,别无他用。guid不是排序键。当然,这是guid上的一个有效点。“为正确的工作使用正确的工具”再次获胜。这不是“基本上”费舍尔·耶茨,而是从列表中随机选择的。它的共同点在于它是公平和公正的。这也是O(n^2)运行时。你究竟为什么要用这种奇怪的方式在随机类中播种时间?random类会根据当前时间自动为自己播种。Nick当然是正确的;如果列表很大,这是非常低效的。Fisher-Yates从帽子中选择数字,当它们被移除时,剩余的数字也会缩小。顺便说一句,OP不需要费舍尔·耶茨,我只是在我认为应该得到表扬的地方给了表扬,它不应该得到-1分。OP只需要从0到10的随机数。Chuck,我想你已经证明了你不应该在循环中创建随机实例。10个重复序列与40个重复序列相比,你不应该想要任何重复序列,除非你正在实际测试PRNG的可重复结果。你可能已经证明的第二件事是,你的版本比较慢,因为它在较低的迭代次数中脱离了重复的领域。如果你提到这是Fisher-Yates shuffle,可能会有所帮助。
IEnumerable<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random rnd = new Random();
list = list.Select(i => new { value = i, rank = rnd.Next(list.Count()) }).OrderBy(n => n.rank).Select(n => n.value);