一:插入排序
- 插入排序算法的介绍:
插入法排序属于内部排序法,是对于预排序的元素以插入的方式找寻该元素的适当位置,然后达到排序的目的 - 插入排序的基本思想
插入排序的基本思想:把N个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码,依次与有序表的元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表.
**理解:**从无序表中每次挑出一个元素,并在有序表中进行排序
二:插入排序的应用实例
有一群小牛,考试成绩分别为101,34,119,1,请从大到小,进行排序
推导代码演示:
package com.qiu.sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101,34,119,1};
insertSort(arr);
}
//编写插入排序的方法
public static void insertSort(int[] arr){
//使用逐步推导的方法来讲,便于理解
//第一轮
//定义待插入的数
int insertValue = arr[1];
//待插入数的索引
int insertIndex =1- 1;//这里的意思就是说待插入的数应该跟这个待插入数的前面一个数进行比较
//也就是说arr[1]的前面一个数的下标
//给insertValue找到插入的位置,insertIndex>=0:保证不越界
while(insertIndex>=0 && insertValue<arr[insertIndex]){
//上面条件就是说这个数还没有找到位置
//将arr[insertIndex]后移
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;//--表示继续向前查找数
}
//当退出while循环时,说明插入位置已经找到,insertIndex+1
arr[insertIndex+1] =insertValue;
System.out.println("第一轮后:");
System.out.println(Arrays.toString(arr));
//第一轮
//定义待插入的数
insertValue = arr[2];
//待插入数的索引
insertIndex =2- 1;//这里的意思就是说待插入的数应该跟这个待插入数的前面一个数进行比较
//也就是说arr[1]的前面一个数的下标
//给insertValue找到插入的位置,insertIndex>=0:保证不越界
while(insertIndex>=0 && insertValue<arr[insertIndex]){
//上面条件就是说这个数还没有找到位置
//将arr[insertIndex]后移
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;//--表示继续向前查找数
}
//当退出while循环时,说明插入位置已经找到,insertIndex+1
arr[insertIndex+1] =insertValue;
System.out.println("第二轮后:");
System.out.println(Arrays.toString(arr));
//第一轮
//定义待插入的数
insertValue = arr[3];
//待插入数的索引
insertIndex =3- 1;//这里的意思就是说待插入的数应该跟这个待插入数的前面一个数进行比较
//也就是说arr[1]的前面一个数的下标
//给insertValue找到插入的位置,insertIndex>=0:保证不越界
while(insertIndex>=0 && insertValue<arr[insertIndex]){
//上面条件就是说这个数还没有找到位置
//将arr[insertIndex]后移
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;//--表示继续向前查找数
}
//当退出while循环时,说明插入位置已经找到,insertIndex+1
arr[insertIndex+1] =insertValue;
System.out.println("第三轮后:");
System.out.println(Arrays.toString(arr));
}
}
代码运行演示:
接着我们优化下这个代码:
package com.qiu.sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class InsertSort {
public static void main(String[] args) {
//测试一下冒泡排序的速度,给8w随机数组
int[] arr1 = new int[80000];
for (int i = 0; i < 80000; i++) {
arr1[i] =(int)(Math.random()*80000000);
}
//测试排序时间
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = format.format(date);
System.out.println("排序前的时间:"+dateStr);
insertSort(arr1);
Date date1 = new Date();
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr1 = format1.format(date1);
System.out.println("排序前的时间:"+dateStr1);
}
//编写插入排序的方法
public static void insertSort(int[] arr){
//使用逐步推导的方法来讲,便于理解
//第一轮
//定义待插入的数
for (int i = 1; i <arr.length; i++) {
int insertValue = arr[i];
//待插入数的索引
int insertIndex =i-1;//这里的意思就是说待插入的数应该跟这个待插入数的前面一个数进行比较
//也就是说arr[1]的前面一个数的下标
//给insertValue找到插入的位置,insertIndex>=0:保证不越界
while(insertIndex>=0 && insertValue<arr[insertIndex]){
//上面条件就是说这个数还没有找到位置
//将arr[insertIndex]后移
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;//--表示继续向前查找数
}
//当退出while循环时,说明插入位置已经找到,insertIndex+1
arr[insertIndex+1] =insertValue;
}
System.out.println(Arrays.toString(arr));
}
}
代码运行如下图,发现排序时间只需要2秒左右