我正在写一个快速排序类,模仿Sedgewick在“算法4”中给出的代码。原始代码是用Java编写的。我用C#翻译了核心部分,但似乎没有用。看来问题出在model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy'])
行中,但我不知道如何解决。
我试图在a = a.OrderBy(x => r.Next()).ToArray()
和ref
方法签名中添加Sort
,但是一旦我在Partition
中调用函数Sort(ref a)
,编译器就会抱怨说Main
。
我还尝试使第一个cannot converte ref System.String[] to ref System.IComparable[]
返回一个Sort
,即已排序的数组。但是,当我在IComparable[]
这样的Main
中调用它时,会抛出运行时错误,提示string[] nums = (string[]) Sort(nums)
Unable to cast object of type 'System.IComparable[]' to type 'System.String[]'.
seconde WriteLine应该打印出排序后的数组,但不是。
答案 0 :(得分:2)
这里的问题不是通过引用传递的,而是您确定的这一行:
a = a.OrderBy(x => r.Next()).ToArray();
您要赋予a
一个新值,这与仅修改a
的内容不同。由于Sort
方法对数组进行了适当的排序,因此您不应该创建新的数组,并且不必在对数组进行排序之前对其进行重新排序。
因此,删除这两行应该可以使您的代码正常工作
Random r = new Random();
a = a.OrderBy(x => r.Next()).ToArray();
当您尝试从Sort
返回数组时,您似乎遇到了一些问题。您可以通过将所有方法都设为通用,并将通用参数T
限制为IComparable<T>
来解决此问题:
public static T[] Sort<T>(T[] a) where T: IComparable<T>
{
Random r = new Random();
a = a.OrderBy(x => r.Next()).ToArray();
Sort(a, 0, a.Length - 1);
return a;
}
private static void Sort<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
if (lo >= hi) return;
int p = Partition(a, lo, hi);
Sort(a, lo, p - 1);
Sort(a, p + 1, hi);
}
private static int Partition<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
int i = lo, j = hi;
T p = a[lo];
while (true)
{
while (Less(a[++i], p))
{
if (i == hi)
break;
}
while (Less(p, a[--j]))
{
if (j == lo)
break;
}
if (i >= j) break;
Exch(a, i, j);
}
Exch(a, lo, j);
return j;
}
private static void Exch<T>(T[] a, int lo, int hi)
{
T tmp = a[lo];
a[lo] = a[hi];
a[hi] = tmp;
}
private static bool Less<T>(T a, T b) where T: IComparable<T>
{
return a.CompareTo(b) < 0;
}
答案 1 :(得分:0)
您需要返回排序后的数组,因为就像您所说的那样,它是通过值而不是通过引用传递的。 将返回类型而不是void添加到Sort方法中,并返回a;
然后改变
排序(数字);
到
nums =排序(nums);