排序-直接插入法

排序-直接插入法

假设数组A={a1,a2,a3,a4…an}

1.从数组开始位置出发,把a1视为只有一个数据的有序数组

2.从a2开始遍历这个数组,拿每一个数据和前面的数据比较,如果前面的数据比这个数据大,那么把前面的数据往后推一个位置并记录其下标,直到前面的数据比这个数小,那么上一个比这个数大的数的位置就是要插入的位置,从a2到an依次插入之后就实现了将数组正序排列,倒序正好相反。

代码:


//直接插入排序法
public class InsertionSort {
	public int[] inserSort(int[] arr) {
		// 当前在右边拿到的第一个要进行操作的数据
		int right;
		// 需要把数据在左边插入的位置
		int insert;
		// 外层循环,控制比较的轮数
		// 同时,变量i的值,还是每一轮我们要操作的右边第一个数字的下标
		for (int i = 1; i < arr.length; i++) {
			// 提前保存好我们当前要操作的值
			right = arr[i];
			// 假设当前变量i的值就是要插入的位置,因为这个数据有可能是原位置不动的。
			insert = i;
			// 内层循环,控制每轮比较的次数,以及比较的顺序
			// 同时,变量j的值,还是左边数据中从大到小的下标值
			// 例如:1 2 4 8 9 | 5 3 这个时候
			// 我们拿着数字5 要依次和左边的9 8 4 2 1 比较
			// 9 8 4 2 1的下标顺序就是4 3 2 1 0 ,这就是j的值的变化规律
			for (int j = i - 1; j >= 0; j--) {
				// 每次比较,如果发现arr[j]比当前要操作的数字大
				if (arr[j] > right) { //这是正序(从小到大),if(arr[j]<right)就是倒序(从大到小)
					// 就把这个大的数字往后移动一个位置,就是往后赋值
					arr[j + 1] = arr[j];
					// 然后记录一下这个位置,因为这个位置很可能是要插入的位置,到底是不是这个位
					// 置,需要和下一个数字比较后才知道
					insert = j;
				} else {
					// 如果发现一个比right值还小的值,那么这个值的上一个比较的位置就是我
					// 们要找的插入的位置,结束当前循环
					break;
				}
			}
			// 内层循环结束后,把当前要操作的值right,插入到指定位置insert
			// 如果insert和当前i值相等,说明当前操作的这个值right是不需要移动
			// 的。
			if (insert != i) {
				// 进行值的插入
				// 把当前右边第一个值(正在操作的值),插入到左边合适的位置
				arr[insert] = right;
			}
		}
		return arr;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值