c# – 如何在适当的位置重新排序数组以将偶数索引项放在奇数之前
我有一个排序数组,我想重新排序,以便先前甚至索引的项目在开头,然后是奇数索引项目.
例如:[a,b,c,d,e,f] => [a,f]. 我也将(另外)想要做相反的事情,首先使用奇数索引: 例如:[a,f] => [b,f,a,e]. 我知道我可以创建单独的奇数/偶数数组然后重新合并它们,但性能是关键,我正在尝试找到一个单循环,就地解决方案,避免分配和使用临时数组. 语境: 我递归搜索一个移动的游戏树(带有alpha-beta的minimax)并且我正在尝试实现Lazy SMP,我在其他线程上搜索相同的位置,但尝试以略微不同的顺序移动,将结果保存到共享(换位) )表,以提高主搜索线程的效率. 澄清: 起始数组已经排序,我希望保持偶数/奇数索引内的顺序.也就是说,我不想只是将平均值和赔率分组在一起,最后说[f,a]. 另外,我严格按索引值排序,而不是存储在那里的项目.因此,任何涉及项值的搜索谓词的方法都不起作用. 虽然我用C#编写,但我不想使用LINQ,因为我需要将代码移植到没有LINQ的系统. 我希望有一种方法可以循环一次数组并执行一系列项目交换,这样我最终会得到我所描述的排序.我一直在纸上尝试,但还没有任何工作. 澄清2: 我用字母而不是数字更新了示例,并在我向后调整奇数/偶数示例时进行了交换.我想要两个. 最终我试图模拟循环原始数组,但跳过所有其他项目仍然查看每个项目.有两个循环我会做以下事情: // Case 1: Regular order for (int i = 0; i < items.Length; i ++) { // Process } // Case 2: Even indexes first for (int i = 0; i < items.Length; i += 2) { // Process } for (int i = 1; i < items.Length; i += 2) { // Process } // Case 3: Odd indexes first for (int i = 1; i < items.Length; i += 2) { // Process } for (int i = 0; i < items.Length; i += 2) { // Process } 循环中的处理足够复杂,因为它递归调用此函数,具有提前终止循环的单独条件等,因此我不想复制它和/或将其放在另一个函数中. 因此,我不是只有两个循环,或者是一个处理所有三种情况的复杂循环,而是选择预先分配项目. 澄清3: 我需要处理所有三种情况的东西,它支持任何大小的数组(不仅仅是#项目),并且没有使游戏搜索循环内容混乱.我认为在该循环之前进行就地预先排序是最好的选择. 最后,我决定放弃使用自定义迭代器跳过项目的就地预排序和扩展List.我在下面添加了我的代码,但我不会将其标记为答案,因为它在技术上并不是我要求的. 谢谢大家的帮助. (如果有人发布了一个循环,基于就地交换的解决方案适用于任意数量的项目,我将很乐意接受它作为答案.) 解决方法
这是一种在阵列上的单个路径中执行的算法.它假设数组具有偶数个项N,并且我们可以分配bool [N / 2]数组:
static void OddEvenSwap(int[] data) { int n = data.Length / 2; int p = 0; var seen = new bool[n]; while (true) { int last = data[p]; do { var tmp = data[p]; data[p] = last; last = tmp; if (p < n) { seen[p] = true; } p = (p/2) + (p%2 == 0 ? n : 0); } while (p >= n || !seen[p]); data[p] = last; while (p != n && seen[p]) { p++; } if (p == n) { break; } } } 以下是其工作原理的简要说明: >给定项目的源索引p,我们总是可以直接计算其目标索引 Demo. 注意:如果重复运行此算法,您应该能够避免重新分配see []数组,方法是以最大大小分配一次,然后简单地用falses填充它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 将UpdateSourceTrigger = PropertyChanged应用于所有
- ruby-on-rails – 无法从带有rails 3.0.10的回溯RSPEC中找到
- postgresql – 批量插入数亿条记录
- objective-c – 属性类型或类使用反射
- c# – 实体框架无法更改关系,因为一个或多个外键属性不可为
- NoSQL简介
- 单元测试 – 我应该为所有内容写单元测试吗?
- 如何在Swift中执行一次代码只执行一次?
- objective-c – tableview – 无法识别的选择器didSelectRo
- ruby-on-rails – validation_context和update_attributes