插入排序的原理
把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;每一趟排序过程都从无序表中取出第一个元素,按顺序去比较有效表(大到小)的数据,将它插入到有序表正确位置,使之成为新的有序表,重复n-1次完成整个排序过程。
插入排序的思路
插入排序的基本思想:给定数组:int[] array={里面n个数据};
- 第一趟排序
从
array[1]
与array[0]
比较,array[1]
<array[0]
,进行交换;
- 第二趟排序
从
array[2]
与array[1]
比较,
array[2]
<array[1]
,进行交换;
接着array[1]
与array[0]
比较,
array[1]
<array[0]
,进行交换;
- 第三趟排序
从
array[3]
与array[2]
比较,
array[3]
<array[2]
,进行交换;
接着array[2]
与array[1]
比较,
array[2]
<array[1]
,进行交换;
接着array[1]
与array[0]
比较,
array[1]
>array[0]
,不交换;
- 第i趟排序
以此类推,从
array[i]
与array[i-1]
比较,
如果array[i]
<array[i-1]
,进行交换;
一直往前进行比较,直到出现array[n-i]
>array[n-i-1]
,
说明array[n-i]
大于array[n-i-1]
前面的值;
插入排序的图解步骤
插入排序的实现
源码地址:GitHub-AralSea,插入排序的实现 SelectionSort类:代码片
.
/**
* 插入排序的实现
* @param array
* @param <T>
*/
public static <T extends Comparable<T>> void insertionSort(T[] array) {
if (null != array && array.length > 0) {
int length = array.length;
for (int i = 0; i < length; i++) {
// 繁琐
/*for (int j = i; j > 0; j--) {
if (array[j].compareTo(array[j-1]) < 0) {
// 交换
SortTestHelp.swap(array, j, j-1);
} else {
break;
}
}*/
// 改建方式
for (int j = i; j > 0 && array[j].compareTo(array[j-1]) < 0; j--) {
// 交换
SortTestHelp.swap(array, j, j-1);
}
}
}
}
插入排序的测试
public static void main(String[] args) {
Integer[] array = {3,6,2,9,7,5,8,0,1,4};
insertionSort(array);
System.out.println(Arrays.toString(array));
// 1.随机生成数组,测试选择排序 和 插入排序的时间比较
int n1 = 10000;
Integer[] array1 = SortTestHelp.generateRandomArray(n1, 0, n1);
System.out.println("array1数组:");
System.out.println(Arrays.toString(array1));
// 复制一份
Integer[] array2 = Arrays.copyOf(array1, n1);
System.out.println("随机生成数组,测试选择排序 和 插入排序的时间比较:");
SortTestHelp.testSort("10万数量的selectionSort", SelectionSort::selectionSort, array1);
SortTestHelp.testSort("10万数量的insertionSort", InsertionSort::insertionSort, array2);
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}