直接插入排序(Java 版)

96 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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];
	}

}