这篇文章重点是Java里的随机函数Math.random(),具体就不分析了,详细的可以百度。这个函数尤为重要,因为在检验一个算法是否正确的时候,我们只能进行有限的次数检验,仅仅靠我们有限的那几个检验,有时候不足以验证算法的正确性。
package com.harrison.java;
public class Comp {
public static void swap(int[] arr,int i,int j) {
int tmp=arr[j];
arr[j]=arr[i];
arr[i]=tmp;
}
public static void selectSort(int [] arr) {
if(arr==null || arr.length<2) {
return;
}
int N=arr.length;
for(int i=0; i<N; i++) {
int minValueIndex=i;
for(int j=i+1; j<N; j++) {
minValueIndex=arr[j]>=arr[minValueIndex]?j:minValueIndex;
}
swap(arr,i,minValueIndex);
}
}
public static void insertSort(int []arr) {
if(arr==null || arr.length<2) {
return;
}
int N=arr.length;
for(int end=1; end<N; end++) {
for(int pre=end-1; pre>=0 && arr[pre]>arr[pre+1]; pre--) {
swap(arr,pre,pre+1);
}
}
}
//返回一个数组arr,arr长度[0,maxLen-1],arr中的每个值[0,maxValue-1]
public static int[] lenRandomValueRandom(int maxLen,int maxValue) {
int len=(int)(Math.random()*maxLen);
int [] ans=new int[len];
for(int i=0; i<len; i++) {
ans[i]=(int)(Math.random()*maxValue);
}
return ans;
}
public static int[] copyArray(int []arr) {
int []ans=new int[arr.length];
for(int i=0; i<arr.length; i++) {
ans[i]=arr[i];
}
return ans;
}
//arr1和arr2一定等长
public static boolean isSorted(int []arr) {
if(arr.length<2) {
return true;
}
int max=arr[0];
for(int i=1; i<arr.length; i++) {
if(max>arr[i]) {
return false;
}
max=Math.max(max, arr[i]);
}
return true;
}
public static void main(String[] args) {
int maxLen=10;
int maxValue=1000;
int testTimes=10000;
for(int i=0; i<testTimes; i++) {
int []arr1=lenRandomValueRandom(maxLen,maxValue);
int []tmp=copyArray(arr1);
selectSort(arr1);
if(!isSorted(arr1)) {
for(int j=0; j<tmp.length; j++) {
System.out.print(tmp[j]+" ");
}
System.out.println();
System.out.println("选择排序错了");
break;
}
}
}
}