直接插入排序(Straight Insertion Sort)- java实现

学习自严蔚敏、吴伟民的《数据结构》-清华大学出版

最简单的排序方法。基本操作是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表。

先看代码:

	public static int[] insertSort(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			// arr[i]需要向前移动
			if (arr[i] < arr[i - 1]) {
				int temp = arr[i];
				int j = i - 1;
				// 比temp(arr[i])大的值向后移动一位
				System.out.println(i + "-"+j);
				for (; j >= 0 && arr[j] > temp; j--) {
					arr[j + 1] = arr[j];
				}
				// **for循环中j--后才判断,所以需要+1
				arr[j + 1] = temp;
			}
		}
		return arr;
	}

简单说明(语言组织不是很好):

在最外层循环,i的值逐渐递增,每增加1,就判断arr[i] < arr[i - 1]

false:说明数组中下标0~i,值是递增的,因此不需要交换值,循环继续

true:说明下标i处的值应该插入数组下标0~(i-1)之间,此时将i处的值赋给中间变量-temp,内层循环从j(i-1)处开始向前循环,直到j >= 0 && arr[j] > temp为止,结束本次内层循环,并将temp的值赋给arr[j + 1],即:arr[j + 1] = temp; 

整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

从空间来看,只需要一个额外的空间-temp;从时间来看,排序的基本操作为:比较两个关键字的大小和移动记录,总的来说,直接插入排序的时间复杂度为O(n2)。

举个例子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值