我有像bubblesort(args)和mergesort(args)这样的排序函数。我该如何让它们可以通过其他方法来测试执行时间等等。
我正在考虑使用单个方法sort()创建函数接口,但是mergesort需要另一个方法merge()。我可以在main中手动完成,但是我想知道是否有更好的方法来测试许多排序函数。
那么像这样的事情也许是
public static void testSorting(Integer arr[], String name, SortingFunction<Integer> func ){
long start = System.nanoTime();
func.sort(arr);
long stop = System.nanoTime();
//lots of testing strings some stuff i dont wanna copy paste it in main
}
public Interface SortingFunction <T> {
public /*T*/ sort(); //need just a single function right so merge sort cant be coded here?
}
我有这样的想法:
SortingFunc bubbleSort = new SortingFunc() {
@Override
public void sort(int[] arr) {
int tmp;
for (int j = 0; j < arr.length; j++) {
for (int i = 1; i < arr.length - j; i++) {
if (arr[i - 1] > arr[i]) {
tmp = arr[i - 1];
arr[i - 1] = arr[i];
arr[i] = tmp;
}
}
}
}
};
SortingFunc mergeSort = new SortingFunc() {
@Override
public void sort(int[] arr) {
}
}
但我不知道如何将递归编码到mergesort函数中。我试着这样做:
SortingFunc mergeSort = new SortingFunc() {
@Override
public void sort(int[] arr) {
class Local {
void mergeSort(int[] a, int n) {
//do merge sorting
}
new Local().mergeSort(); //compilation error
}
}
};
但是我得到编译错误:java:非法的类型开头
已解决
格式被关闭了,我把新的放在了班级正文里。应该是的
class Local {
void mergeSort(int[] a, int n) {
//do merge sorting
}
}
new Local().mergeSort(arr, arr.length);
我向你们介绍我的主要方法:
public static void main(String[] args) {
SortingFunc bubbleSort = new SortingFunc() {
@Override
public void sort(int[] arr) {
//bubble sort...
}
};
SortingFunc mergeSort = new SortingFunc() {
@Override
public void sort(int[] arr) {
class Local {
void mergeSort(int[] a, int n) {
//merge sort....
}
}
new Local().mergeSort(arr, arr.length);
}
};
System.out.println(test(getNonRepeatableRandomArray(1000),bubbleSort));
System.out.println(test(getReversedSortedArray(1000), mergeSort));
感谢您的帮助,它工作正常,看起来棒极了,应该能让我在未来的需要中坚持一段时间。接下来将把排序算法作为一个对象存储在一个文件中或者可以从web下载。
1条答案
按热度按时间eoxn13cs1#
好样的。这么少的代码,这么多的内容!
错误的样式1:后缀数组表示法。
Integer arr[]
在很多方面都是错误。这是一个风格错误;我们用java编写Integer[] arr
.Integer arr[]
合法,但不推荐;混合空格和制表符也是合法的,但也不要这样做。30年前,java被创造出来,从语法Angular 看,它与c非常相似,在c中,这是合法的,而且有些常见。但是java不是c语言,一点也不像。这个策略奏效了;大量的c程序员采用java。但这确实意味着有很多方法可以编写技术上合法的代码,但是,没有。错误的样式2:整数而不是int
其次,
Integer
是对象 Package 器。你不会想要的。你想要什么int
. integer是一个指针,如果底层的整数都分布在内存中,则主要是测量缓存线的性能。int[]
至少保证连续的内存。那不是你计时的方式
java太复杂了,不能用这样的时间。使用jmh。你可以在网上搜索你为什么需要这个,原因有很多。从隔离“哦,你的winamp切换歌曲”到热点规范化。
仿制药滥用
泛型把事物联系起来。你用你的
T
在一个地方,这(几乎)总是错误的。把它移到这里。代码已断开
您有一个排序方法,该方法在
SortingFunction
函数接口,但随后要传递一个数组,这显然无法工作。答案
大概你想要这样的东西:
并定义排序函数,它将“就地”排序(它将修改
arr
),这意味着您的框架代码每次都需要创建一个新的arr,或者将int数组中的每个元素重写回原始状态,这可能更“公平”(内存位置问题不会影响计时的可能性更大)。