详细解读插入排序

6 篇文章 0 订阅

1.分析 

      插入排序的思想是在一个数组中,从第二个数开始,慢慢插入前面的排好序的数组中。各位朋友 如果想彻底弄懂插入排序的思想,我建议大家把下面这段代码弄过去自己推理一遍。如果还是不懂,再来慢慢看我下面的推理过程。

2.推理

     我们就拿下面代码中的例子来说吧,有一个数组 {9748 ,9024 ,5544, 1832 ,3344},第一层循环先从i = 1开始,第二层循环就是从j=i开始,依次与前面的数作比较,满足if条件后就将它们交换位置,此时数组的顺序变为{9024 ,9748 ,5544, 1832 ,3344},就是相当于9024插入到数组{9748}中。接着就是i=2,第二层循环也是从j=i开始,也是依次与前面的数做比较,满足条件后就将它们交换位置,此时的数组顺序就会变为{5544, 9024 ,9748 ,1832 ,3344},也相当于将5544插入到数组{9024,9748}中。以此类推,i=3数组的顺序变成{1832 ,5544, ​​​​​​​9024 ,9748 ,3344},就相当于将1832插入到数组{5544,9024,9748}中。i=4也是一样。

3.代码实现

/**
 * @filename InstertionSort
 * @description 插入排序
 * @author market
 * @date 2021/4/8 10:49
 */
public class InstertionSort {
	public static void main(String[] args) {
		int[]arr = {9024 ,9748 ,5544, 1832 ,3344};
		int[] arraySort = arraySort(arr);
		print(arraySort);
	}
	//算法核心
	public static int[] arraySort(int [] arr){
		for (int i = 1; i < arr.length; i++) {
			for (int j = i ; j > 0 ; j--) {
				if (arr[j]<arr[j-1])
					swap(arr,j,j-1);
			}
		}
		return arr;
	}

	//交换位置
	public static void swap(int[]arr,int i,int j){
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	//输出打印
	public static void print(int [] arr){
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}
}

4.图解

       这张图是我直接取的《菜鸟教程》中的原图(如有侵权,请联系删除),如果推理代码还有点似懂非懂的话,建议再结合下面的动态图理解一下。

5.校验代码

     最近学习算法的时候,写了一个校验排序算法正确性的代码,它会生成1000份长度为10000的随机样本,排序后与Java自带的sort(系统自带,我们默认它准确)排序结果做比较。


import java.util.Arrays;
import java.util.Random;

/**
 * @filename CheckAlgorithm
 * @description 校验算法的准确性
 * @author market
 * @date 2021/4/8 9:17
 */
public class CheckAlgorithm {
	public static void main(String[] args) {
		long beforTime = System.currentTimeMillis();
		for (int i = 0; i < 1000; i++) {  //生成1000次次随机样本并校验
			int[] generateArray = generateArray();
			System.out.println("第"+i+"次比较结果:"+checkArray(generateArray));
		}
		long afterTime = System.currentTimeMillis();
		System.out.println("比较所有样本耗时:"+(afterTime-beforTime));
	}

	//生成随机样本
	public static int[] generateArray(){
		int[]arr = new int[10000];
		Random r = new Random();
		for(int i = 0;i<arr.length;i++){
			arr[i] = r.nextInt(10000);
		}
		return arr;
	}

	//校验方法
	public static String checkArray(int[]arr){
		int[]arrCopy = arr.clone();
//		SelectionSort.arraySort(arrCopy);
//		BubbleSort.arraySort(arrCopy);
		InstertionSort.arraySort(arrCopy);
		Arrays.sort(arr);
		boolean flag = true;
		for (int i = 0; i < arr.length; i++) {
			if (arrCopy[i]!=arr[i]){
				flag=false;
			}
		}
		return flag==true?"true":"false";
	}
}

6.校验结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值