对数器的概念和使用

  1. 有一个你想要测的方法a,
  2. 实现一个绝对正确但是复杂度不好的方法b,
  3. 实现一个随机样本产生器
  4. 实现比对的方法
  5. 把方法a和方法b比对很多次来验证方法a是否正确。
  6. 如果有一个样本使得比对出错, 打印样本分析是哪个方法出错
  7. 当样本数量很多时比对测试依然正确, 可以确定方法a已经正确。
package Sort;import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int value=100;//数组中元素绝对值的最大值int size=10;//数组中元素个数的最大值boolean flag=true;for(int i=0;i<500000;i++) {int[] arr1=randomgenerator(size,value);int[] arr2=copyArray(arr1);bubbleSort(arr1);rightMethod(arr2);if(!isEqual(arr1,arr2))flag=false;break;}System.out.println(flag?"Nice":"So bad!");}public static void bubbleSort(int[] arr) {if(arr==null||arr.length<2)return;for(int end=arr.length-1;end>0;end--) {for(int i=0;i<end;i++) {if(arr[i]>arr[i+1])swap(arr,i,i+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static int[] randomgenerator(int size,int value) {//随机数生成器//Math.random()-->[0,1),double类型的//(int)((size+1)*Math.random())-->[0,size]的整型int len=(int)((size+1)*Math.random());int[] arr=new int[len];for(int i=0;i<len;i++) {//元素中,0、正数、负数都有arr[i]=(int)((value+1)*Math.random())-(int)((value+1)*Math.random());}return arr;}public static boolean isEqual(int[] a,int[] b) {//对比两个数组是否相等:长度以及内部元素if((a==null&&b!=null)||(a!=null&&b==null))return false;if(a==null&&b==null)return true;if(a.length!=b.length)return false;for(int i=0;i<a.length;i++) {if(a[i]!=b[i])return false;}return true;}public static int[] copyArray(int[] a) {//拷贝数组,使得数组长度以及内部元素都相同if(a==null)return null;int[] arr=new int[a.length];for(int i=0;i<a.length;i++) {arr[i]=a[i];}return arr;}public static void rightMethod(int[] a) {//绝对正确的方法,用于验证Arrays.sort(a);}}

运行结果:

2.归并排序

package Sort;public class MergeSort {public static void main(String[] args) {int[] array= {4,3,7,2,6,4,9};mergeSort(array);for(int i=0;i<array.length;i++)System.out.print(array[i]+" ");}public static void mergeSort(int[] arr) {if(arr==null||arr.length<2)return;sortProcess(arr,0,arr.length-1);//此处注意串的是下标}public static void sortProcess(int[] arr,int L,int R) {if(L==R)return;int mid= L + ((R - L) >> 1);sortProcess(arr,L,mid);sortProcess(arr,mid+1,R);merge(arr,L,mid,R);}public static void merge(int[] arr,int L,int mid,int R) {//注意此处的R是末尾元素的位置,不是长度int[] result=new int[R-L+1];//所以此处求长度应+1int p1=L;int p2=mid+1;int i=0;while(p1<=mid&&p2<=R) {//所以此处比较应该包含mid和R,就是≤,而不是</*if(arr[p1]<arr[p2])result[i++]=arr[p1++];elseresult[i++]=arr[p2++];*/result[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];}/*if(p1>mid)while(p2<=R)result[i++]=arr[p2++];if(p2>R)while(p1<=mid)result[i++]=arr[p1++];*/while(p1<=mid) {//p1没越界,即p2越界result[i++]=arr[p1++];}while(p2<=R) {result[i++]=arr[p2++];}for(int j=0;j<result.length;j++) {//复制元素的时候,要注意下标,因为传入的arr是从L~R的,不是从0~arr.length-1arr[j+L]=result[j];}}}

算法复杂度:

使用master公式:

额外空间复杂度:,一个辅助数组的大小。

算法练习day3——190320(对数器、归并排序)相关推荐

  1. 数据结构与算法JC班-左程云第一节课笔记(认识复杂度、对数器、二分法与异或运算)

    第1节 认识复杂度.对数器.二分法与异或运算 程序=算法+数据结构,既然算法这么重要,每个人写出来的算法又不一样,那么怎么算是一个好的算法呢? 1.评估算法优劣的核心指标是什么? 时间复杂度(流程决定 ...

  2. 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)

    背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...

  3. 什么是对数器?对数器的作用是什么?

    对数器是什么? 通常我们在笔试的时候或者参加编程大赛的时候,自己实现了一个算法,但是不能够判断该算法是否完全没问题,如果在比赛平台上验证,通常只会告诉你有没有错误,出了错不会告诉你哪里有问题,对于排错 ...

  4. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)

    Algorithm:C++语言实现之内排序.外排序相关算法(插入排序 .锦标赛排序.归并排序) 目录 一.内排序 1.插入排序 2.锦标赛排序 3.归并排序 二.外排序 1.过程 一.内排序 1.插入 ...

  5. Java | 使用对数器判断自己的程序是否正确(generateRandomArray)

    对数器:利用系统产生多个随机样本,将系统排序的结果和自己写的程序输出结果进行比对,判断是否正确. 目录结构 SelectionSort.java DataChecker.java 1 选择排序程序完整 ...

  6. Java实现穷举_对数器实现(C++)

    主要参考左神的JAVA版的对数器实现,主要分为以下几个步骤: 产生随机数组或者字符串,本例产生随机数组 找一个绝对正确的方法,不管复杂度 对比自己实现的方法和绝对正确的方法的结果,若相同,则返回tru ...

  7. JAVA-希尔排序-Knuth序列以及对数器

    JAVA-希尔排序-Knuth序列以及对数器 -改进的插入排序(间隔大时移动的次数少,间隔小时移动的距离短–所以加快了效率) public static void main(String[] args ...

  8. 算法 JAVA 对数器

    import java.util.Arrays;public class VerifyNumericalTool {// 开时测试public static void main(String[] ar ...

  9. 【算法导论】【ACM】归并排序总结

    许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关地若干子问题.这些算法典型的遵循分治法地思想:将原问题分解成几个规模较小但类似于原问题的子问题,递归 ...

最新文章

  1. HCNA多区域OSPF配置
  2. Android使用Glide加载Gif.解决Glide加载Gif非常慢问题
  3. python如何让用户输入文件名并打开文件_(Python)如何让用户打开文本文件然后更改整数/数字...
  4. JavaScript实现计算需要更改的位数,以便将 numberA转换为 numberB(bitsDiff)算法(附完整源码)
  5. llvm编译器实战教程第二版_LLVM编译器实战教程
  6. 在python3中print作为函数存在_Python3中的print函数
  7. honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
  8. java内联_JAVA中的内联函数
  9. hdu 1520 Anniversary party(第一道树形dp)
  10. 2021年双非院校保研浙江大学软件学院末位上车经验记录
  11. 【欧拉猜想】是否有无穷多个不可约分的正整数解
  12. 清华大学计算机崔勇,崔勇 简历 - 名人简历
  13. 使学习效率提高5倍的20个起始步骤
  14. Intel SGX开发者参考书(四)—— Enclave开发基础(三)
  15. MAC上写Verilog并编译仿真
  16. 快速压缩视频大小方法
  17. 2022-2028年中国医疗信息化行业深度调研及投资前景预测报告
  18. 第一章 python筑基
  19. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律
  20. Python实现银行金额大写汉字转换【简单易懂】!!

热门文章

  1. Python 调用C函数
  2. Centos iptables常用命令及设置
  3. [Linux Mysql] Linux下Mysql的基本操作
  4. 如何才能在SQL查询器中使用语句查询出表的列名及数据类型(包括类型和长度)...
  5. 获取 iPhone 上联系人姓名、电话、邮件的代码
  6. 转:[C#]获取某年指定周的开始日期和结束日期的通用方法
  7. access下的分页方案(仿sql存储过程)
  8. django 入门,快速搭建一个后端接口
  9. Java ACM模式
  10. k8s operator开发脚手架kubebuilder 3.2.0安装脚本整理