算法模块前言
2023/7/3...大约 2 分钟
算法模块前言
时间复杂度
对数器
用简单易实现的暴力方法得到的结果与当前自己编写的方法的结果进行比较,进行大批量的随机数据的比较如果的到的结果一致则认为自己编写的程序正确。
这种方法的好处:可以不依赖线上的 OG 来判断编写结果是否正确
缺点:需要实现两种方式
如下是插入排序的对数器:
package learn.note.algorithm.sort.three;
import java.util.Arrays;
/**
* @author Wang WenLei
* @date 2025/7/24 10:53
* @since 1.0
*/
public class InsertSort {
public static void main(String[] args) {
int forCount = 50000;
int max = 100;
int len = 100;
boolean flag = false;
// 比较 5000 次
for (int i = 0; i < forCount; i++) {
// 生成随机数列
int[] arr1 = randomData(max, len);
// 拷贝随机数列
int[] arr2 = copyArray(arr1);
// 自己写的插入排序
insertSort(arr1);
// 使用java原生排序
compareSort(arr2);
// 结果逐个对比,如果不一致打印 “排序错误”
for (int j = 0; j < len; j++) {
if (arr1[j] != arr2[j]) {
Arrays.stream(arr1).forEach(System.out::print);
System.out.println("排序错误");
Arrays.stream(arr2).forEach(System.out::print);
flag = true;
break;
}
}
if (flag) {
break;
}
}
// 全部都正确,打印 “排序正确”
if (!flag) {
System.out.println("排序正确");
}
}
private static int[] copyArray(int[] arr1) {
int[] ints = new int[arr1.length];
System.arraycopy(arr1, 0, ints, 0, arr1.length);
return ints;
}
private static int[] randomData(int max, int len) {
int[] ints = new int[len];
for (int i = 0; i < len; i++) {
ints[i] = (int) (Math.random() * max + 1);
}
return ints;
}
public static void insertSort(int[] data) {
if (data == null || data.length <= 1) {
return;
}
for (int i = 1; i < data.length; i++) {
// 前一个比当前大,交换直到,前一个比当前小,结束循环
for (int j = i; j > 0 && data[j - 1] > data[j]; j--) {
swap(data, j - 1, j);
}
}
}
public static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
public static void compareSort(int[] data) {
Arrays.sort(data);
}
}
基于这个版本,编写一个工具类
package learn.note.algorithm.sort.three;
import java.util.Arrays;
import java.util.function.Consumer;
/**
* @author Wang WenLei
* @date 2025/8/4 9:23
* @since 1.0
*/
public class CompareMachineUtil {
public static void compare(Consumer<int []> consumer, Consumer<int []> compareConsumer) {
int forCount = 50000;
int max = 100;
int len = 100;
boolean flag = false;
for (int i = 0; i < forCount; i++) {
int[] arr1 = randomData(max, len);
int[] arr2 = copyArray(arr1);
consumer.accept(arr1);
if (compareConsumer != null) {
compareConsumer.accept(arr2);
} else {
// 默认用排序
compareSort(arr2);
}
for (int j = 0; j < len; j++) {
if (arr1[j] != arr2[j]) {
Arrays.stream(arr1).forEach(System.out::print);
System.out.println("对数错误");
Arrays.stream(arr2).forEach(System.out::print);
flag = true;
break;
}
}
if (flag) {
break;
}
}
if (!flag) {
System.out.println("恭喜对数正确");
}
}
private static void compareSort(int[] data) {
Arrays.sort(data);
}
private static int[] copyArray(int[] arr1) {
int[] ints = new int[arr1.length];
System.arraycopy(arr1, 0, ints, 0, arr1.length);
return ints;
}
private static int[] randomData(int max, int len) {
int[] ints = new int[len];
for (int i = 0; i < len; i++) {
ints[i] = (int) (Math.random() * max + 1);
}
return ints;
}
}