持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 4 天,点击查看活动详情
直接插入排序(Java 版)
-
同 冒泡排序一样,主要写了
六种基本数据类型(byte、short、int、long、float、double)的排序算法。 -
Arrays.sort(longs1);是 Java 提供的排序方法,可以用来比较看看有没有成功。 -
升序、降序就是比较上有区别,其他无不同。 -
因为
基本数据类型不能用泛型表示,所以每个数据类型都要写一个排序方法,但基本一样。 -
其中,
整数用byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)来存储。 -
小数用float(4 字节)、double(8 字节)来存储。
原理
-
将数组(链表)中的数据分为两个区间:
已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。 -
插入排序每次会
从未排序区间中找一个元素(这个元素一般是取未排序区第一位元素),在已排序区间中找到合适的插入位置将其插入,保证已排序区间的数据一直有序。 -
重复这个过程,
直到未排序区间中元素为空,算法结束。
图示
代码
-
以
传入 int[] 数组的算法为例 -
找
待插入元素 tmp插入位时,同时将元素后移,腾出位置给 tmp
public class InsertionSort {
/**
* 将 int[] 进行排序(整数排序)
* <p>
* 升序
*
* @param a int[]
*
* @return int[]
*/
public static int[] sortAsc(int[] a) {
// 用来保存取到的待排序元素
int tmp;
// 默认第一个元素属于 已排序区
for(int i = 1; i < a.length; i++) {
// 取待排序区的第一个元素
tmp = a[i];
// 从后往前遍历已排序区,找到 待排序元素 应该存放的位置
int j = i - 1;
while(j >= 0 && a[j] > tmp) {
// 元素后移一位
move(a, j, j + 1);
j--;
}
// 循环结束,就是找到了
// 要放到 a[0] 也是这样
// j 在结束循环时,又减少了 1,所以要加 1
a[j + 1] = tmp;
}
return a;
}
/**
* 将 int[] 进行排序(整数排序)
* <p>
* 降序
*
* @param a int[]
*
* @return int[]
*/
public static int[] sortDesc(int[] a) {
int tmp;
for(int i = 1; i < a.length; i++) {
tmp = a[i];
int j = i - 1;
while(j >= 0 && a[j] < tmp) {
move(a, j, j + 1);
j--;
}
a[j + 1] = tmp;
}
return a;
}
/**
* 移动方法,移动 int 数组中的 某个元素到目标位置(基本数据类型)
* <p>
* 不需要交换
*
* @param array 数组
* @param o 元素所在的位置 下标
* @param t 元素要移动到的位置 下标
*/
private static void move(int[] array, int o, int t) {
array[t] = array[o];
}
}