插入排序

插入排序算法原理:类似于我们打扑克时,在手里安排牌的顺序一样,总是从后往前一直对比着来插牌,插入排序也是这样的,假设有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;
	}
}

 

点赞