最近正在学排序算法,看左程云老师的视频了解到通过肉眼查看我们打印的排序结果是否正确是不太靠谱的,而且具有一定的偶然性,所以需要一个校验器来检验我们的排序是否正确,下面就是我写的一个简单的排序算法校验器。
package mashibing;
import java.util.Arrays;
import java.util.Random;
public class BaseSort {
/**
* 用于打印数组
* @param arr:需要打印的数组
* @param isSort:是否让系统帮助排序
*/
public void print(int[] arr,boolean isSort) {
if(isSort) {
Arrays.sort(arr);
}
System.out.println(Arrays.toString(arr));
}
/**
* 校验器
*/
public boolean check() {
Random random = new Random();//用于生成随机数
int sampleSize = 10;//样本容量
int frequency = 10;//校验的次数
for (int i = 0; i < frequency; i++) {
int[] arr1 = new int[sampleSize];
int[] arr2 = new int[sampleSize];
//生成随机数数组
for (int j = 0; j < sampleSize; j++) {
arr1[j] = random.nextInt(sampleSize);
}
//将数组复制一份,一份使用Java自带的Arrays.sort排序,一份使用我们的算法排序
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
Arrays.sort(arr1);
//这里让你的类继承BaseSort,然后重写sort方法,就是调用你的排序算法啦
this.sort(arr2);
for (int k = 0; k < arr1.length; k++) {
if(arr1[k] != arr2[k]) {
//如果排序的结果出现不一致,表示算法错误
return false;
}
}
}
//通过校验,算法正确
return true;
}
/**
* 该类用于被继承,这里的sort不做任何事情,只是为了check函数能够通过编译
*/
public void sort(int[] arr) {
System.err.println("BaseSort does nothing");
}
/**
* 用于交换arr数组中index1,index2下标的元素
*/
public void swap(int[] arr,int index1,int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
然后只需要我们编写一个需要校验排序算法的类,继承上面的BaseSort即可。下面是一个选择排序的示例:
package mashibing;
public class InsertionSort extends BaseSort{
public static void main(String[] args) {
BaseSort is = new InsertionSort();
//调用校验器查看算法是否正确
System.out.println(is.check()?"算法正确!":"算法错误!");
//对比一下,人工查看排序算法是否正确
int[] arr = {9,3,1,4,6,8,7,5,2};
is.sort(arr);
is.print(arr, false);
}
/**
* 这里就是你的排序算法啦!
* 数组作为参数,传递的是他的引用?
*/
public void sort(int[] arr) {
System.out.println("【InsertionSort】sorting!");
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
if(arr[j] < arr[j-1]) {
this.swap(arr, j, j-1);
}
}
}
}
}