插入排序算法原理:类似于我们打扑克时,在手里安排牌的顺序一样,总是从后往前一直对比着来插牌,插入排序也是这样的,假设有n个数,那么我们设定一个下标i,让i的值等于下标1;然后再给定一个下标j,让j的值等于i-1,这样一来,j的值就指向了i的前一个数,而i则指向我们的当前数,然后让下标为j的数与当前数做比较,如果下标为j的数比当前数大,则下标为j的数与下当前数交换位置,这样我们的i所指向的当前数就往前挪了一个位置,接着,j-1,让下标为j-1的数与我们的当前数继续做比较,如果下标为j-1的数比我们的当前数大,则继续交换位置,然后,j接着减一,继续和我们的当前数做比较,直到j-1<0为止。
package alrithmetic;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 设置参数
int maxsize=50;
int maxvalue=100;
int maxtime=10000;
boolean success=true;
// 开始测试
for (int i = 0; i < maxtime; i++) {
int[] arr1=generarray(maxsize, maxvalue);
int[] arr2=copyarray(arr1);
// 开始测试两个排序函数
insertsort(arr1);
compare(arr2);
// 比较测试结果,只要有一次不一样,就退出测试
if (!isequal(arr1, arr2)) {
success=false;
break;
}
}
// 判断success的值为true or false
System.out.println(success?"well done":"fucking fucked");
// 最后使用我们自定义的冒泡函数
int[] arr3=generarray(maxsize, maxvalue);
printarray(arr3);
insertsort(arr3);
printarray(arr3);
}
// 插入排序
public static void insertsort(int[] arr){
for (int i = 1; i < arr.length; i++) {
for(int j=i-1;j>=0;j--){
if (arr[j]>arr[j+1]) {
swap(arr, j, j+1);
}
}
}
}
// 交换数组中两个数的数值
public static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
// 打印数组函数
public static void printarray(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
// 复制数组,保证两个测试的数组内容大小一样
public static int[] copyarray(int[] arr){
int[] arr1=new int[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i]=arr[i];
}
return arr1;
}
// 随机产生一个数组(数组大小随机,内部元素随机),增加测试的正确性.我们一般把这成为对数器,取代线上oj平台
public static int[] generarray(int maxsize,int maxvalue){
int[] arr=new int[(int) ((maxsize+1)*Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i]=(int)((maxvalue+1)*Math.random())-(int)((maxvalue)*Math.random());
}
return arr;
}
// 调用java自带的系统排序算法,用来做比较
public static void compare(int[] arr){
Arrays.sort(arr);
}
// 判断两个数组是否相等
public static boolean isequal(int[] arr1,int[] arr2){
if (arr1==null&&arr2!=null || arr1!=null&&arr2==null) {
return false;
}else if (arr1==null&&arr2==null) {
return false;
}else if (arr1.length!=arr2.length) {
return false;
}
for (int i = 0; i < arr2.length; i++) {
if (arr1[i]!=arr2[i]) {
return false;
}
}
return true;
}
}