常见排序算法之插入排序
原创
©著作权归作者所有:来自51CTO博客作者wx63c373b99113d的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1、概述
- 2、代码实现
- 3、测试代码
1、概述
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个数据插入到已经排好序的数据表中,从而一个新的长度数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
2、代码实现
实现思路:我们将我们的数据想象成三堆。第一堆是我们已经排好序的数字,第二堆是我们手上拿的数字,第三堆是还没有排序的数字。我们手中的数字会出现(n-1)次,所以我们需要循环(n-1)次。每一次循环的目的是为了将我们手中的数字放到第一堆中恰当的位置,那么就需要与前一堆数字依次进行比较,如果数字比较成功(前一个数字比后一个大),那么我们就将成功的数字往后移动(arr[index+1] == arr[index]),即可完成插入排序
public class InsertSortTest02 {
public static void main(String[] args) {
int[] arr = {11, 3, 2, 4, -2};
for(int i =1 ; i < arr.length; i++) {
//1.获取到我们需要插入的数据,并保存
int insertVale = arr[i];
//2.获取到我们需要插入的数据对应索引的前一个位置(我们数据的比较方式为从后往前)
int insertIndex = i - 1;
//3.如果我们拿来插入的数据,比我们前面以有的数据小,那我们就依次往前查找到对应的合适的位置,再跳出循环
while (insertIndex >= 0 && insertVale < arr[insertIndex]) {
//4.如果插入不成功,我们就将数据值往后移动一格
arr[insertIndex + 1] = arr[insertIndex];
//5.将我们需要比较的数字索引往前移动一格
insertIndex--;
}
//优化:如果我们待插入的数字位置没有发生改变(就是当前位置,不需要变化)
if(insertIndex+1 != i){
//6.将我们需要插入的数据,放到我们之前循环过后得到的对应的索引的所谓
arr[insertIndex + 1] = insertVale;
}
}
System.out.println(Arrays.toString(arr));
}
}
3、测试代码
利用我们以有的条件,进行一个小案例的测试:计算将数组长度为80000的乱序数组排序所花费的时间
package pers.mobian.charu;
import java.util.Arrays;
public class InsertSortTest03 {
public static void main(String[] args) {
//1.自定义长度为80000的随机数组
int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random() * 80000);
}
long start = System.currentTimeMillis();
insertSort(arr);
long end = System.currentTimeMillis();
//2.打印对应的消耗的时间
System.out.println("插入排序的时间为:" + (end - start));
}
//插入排序方法
public static void insertSort(int[] arr) {
int insertVale;
int insertIndex;
for (int i = 1; i < arr.length; i++) {
insertVale = arr[i];
insertIndex = i - 1;
while (insertIndex >= 0 && insertVale < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
if (insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVale;
}
}
}
}