算法原理
直接插入排序:首先说明下,直接插排意思是在有序数组中插入一条记录。
因此理解此数组只由三个部分组成,无需数组,已排序数组,本次插入的记录。
下面详细讲解步骤
看图
步骤说明
1.首先我们默认第一个元素是有序的,将他作为有序数组,后一位元素作为比较的记录取出
2.比较后一位元素(以图为例为1)和此时有序数组中的最后一位比较(即最大值)。
3.比较分为两种情况,小于,不小于最大值。当小于最大值时,最大元素需要后移一格腾出空间,此记录插入。同时再比较有序数组重复。直至此记录不大于有序数组某一位数据,然后将记录插入至此
代码初版
public static void main(String[] args) {
int[] num = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
//直接插入
insertionSort(num);
}
/**
* 插入排序,内层是有序的数组,外层是无序的数组,每次从外层取到值,在内层与有序数组比较大小,
* 进行横移插入操作
*/
public static void insertionSort(int[] num){
int j;
for (int i = 1; i < num.length; i++) {
for(j = i; j>0 ;j--) {
if (num[j]<num[j-1]){
int temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
}
}
}
System.out.println(Arrays.toString(num));
}
改进,其实从代码可以发现,每次更新都需要进行值交互,但我们在外层循环时,实际上是内层腾出一个位置,外层再将值放入,因此,内层可简化,循环后在对应位置留下空位,之后的数据后移
外层循环内将值直接插入至空位置
public static void main(String[] args) {
int[] num = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
//直接插入
insertionSort(num);
}
/**
* 插入排序,内层是有序的数组,外层是无序的数组,每次从外层取到值,在内层与有序数组比较大小,
* 进行横移插入操作
* @param num
*/
public static void insertionSort(int[] num){
int j;
for (int i = 1; i < num.length; i++) {
int temp = num[i];
for(j = i; j>0&&num[j]<num[j-1] ;j--) {
num[j] =num [j-1];
}
num[j] = temp;
}
System.out.println(Arrays.toString(num));
}