C#:Swap 方法的良好/最佳实现

标签 c# sorting shuffle

我读了这个post about card shuffling在许多混洗和排序算法中,您需要交换列表或数组中的两个项目。但是,好的且高效的 Swap 方法是什么样的?

假设一个 T[]List<T> .您如何最好地实现一种方法来交换这两项中的两项?

Swap(ref cards[i], ref cards[n]);   // How is Swap implemented?

最佳答案

好吧,您发布的代码 (ref cards[n]) 只能使用数组(而不是列表)- 但您可以简单地使用 (where foo > 和 bar 是两个值):

static void Swap(ref int foo, ref int bar) {
    int tmp = foo;
    foo = bar;
    bar = tmp;
}

或者可能(如果你想要原子的):

Interlocked.Exchange(ref foo, ref bar);

不过,就我个人而言,我不认为我会为交换方法而烦恼——直接进行即可;这意味着您可以使用(对于列表或数组):

int tmp = cards[n];
cards[n] = cards[i];
cards[i] = tmp;

如果您真的想编写一个适用于列表数组的交换方法,您必须执行如下操作:

static void Swap(IList<int> list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
}

(使这个通用化是微不足道的) - 然而,在数组上工作的原始“内联”版本(即不是方法)会更快。

关于C#:Swap 方法的良好/最佳实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552731/

相关文章:

重新排列数据框中的行序列

c# - 是什么 ?[]? C#中的语法?

Javascript:对数组进行排序并返回一个索引数组,指示已排序元素相对于原​​始元素的位置

JavaScript 数组排序

c - 在C中按字母顺序对文件中的结构进行排序

python - 有没有更快版本的 numpy.random.shuffle?

c# - ServiceStack RedisServerEvents 创建数千个键

c# - 获取 .NET 方法返回值的属性数据

C# - 如何跳过具有默认值的参数?

java - Shuffle 在 Java 中不工作