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";
}
}