gpt4 book ai didi

c# - 在递归排序算法中通过引用传递数组的混淆

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:18 25 4
gpt4 key购买 nike

我对按引用传递数组感到困惑。由于数组存储在堆上,我相信当它们作为参数传递时,参数的值就是堆中的位置。这可能会混淆变量所代表的内容。

  1. 如果数组存储在堆上,那么在将数组传递给方法时 ref 关键字究竟意味着什么?我相信更改被调用方法中的数组会更改调用方法,因为它是按值传递的,并且值包含对数组的引用。

  2. 如果我跳过 Sort 而是直接调用 DoSort,则 unsortedArray 会正确排序。在下面的程序中,为什么 unsortedArray 在执行结束时从未排序?这与这是一个递归算法有什么关系吗?

代码如下:

public class Program {
static void Main(string[] args) {
int[] unsortedArray = new[] { 9, 7, 5, 3, 1 };
Sort(unsortedArray);
}

public static void Sort(int[] sortArray) {
DoSort(ref sortArray);
}

public static void DoSort(ref int[] doSortArray) {
if (doSortArray.Length == 1) {
return;
}
int midpoint = doSortArray.Length / 2;

// divide the array into the left portion
int[] left = new int[midpoint];
for (int i = 0; i < midpoint; i++) {
left[i] = doSortArray[i];
}

// divide the array into the right portion
int[] right = new int[doSortArray.Length - midpoint];
int j = 0;
for (int i = midpoint; i < doSortArray.Length; i++) {
right[j] = doSortArray[i];
j++;
}

DoSort(ref left);
DoSort(ref right);

doSortArray = Merge(left, right);
}

/// <summary>
/// Merges the specified unmerged array.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
private static int[] Merge(int[] left, int[] right) {
int i = 0;
int[] result = new int[left.Length + right.Length];

int leftIndex = 0;
int rightIndex = 0;
while (leftIndex < left.Length || rightIndex < right.Length) {
if (leftIndex < left.Length && rightIndex < right.Length) {
if (left[leftIndex] <= right[rightIndex]) {
result[i] = left[leftIndex];
leftIndex++;
} else {
result[i] = right[rightIndex];
rightIndex++;
}
}
else if (leftIndex < left.Length) {
result[i] = left[leftIndex];
leftIndex++;
}
else if (rightIndex < right.Length) {
result[i] = right[rightIndex];
rightIndex++;
}
i++;
}

return result;
}
}

Passing Arrays as Arguments (C# Programming Guide)

最佳答案

这是区别:

int[] array = null;
DoSort(array)
//array is still null

DoSort(int[] array)
{
array = new int[10];
}

...

int[] array = null;
DoSort(ref array)
//array is new int[10]

DoSort(ref int[] array)
{
array = new int[10];
}

无论哪种情况,您都可以更改数组的内容。只有通过引用传递时,才能在调用方更改引用的实际值。

因为这一行,你的例子需要 ref

doSortArray = Merge(left, right);

关于c# - 在递归排序算法中通过引用传递数组的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com