直接插入排序

在插入排序中,一个数组被分成独立的两个部分,有序的部分和无序的部分。然后将无序的那一部分逐个插入到有序的序列,等无序部分的数列完全插入到有序序列后,整个数组则是有序的。
插入规则:用index记录比插入数据大的数据的下标,用于记录要插入数据插入的位置,初始时index为无序数组中要插入数据的下标。将无序数组的第一个数据从有序数组的最后一个数据进行比较。当有序数组中的数大于要插入的数时,将有序数组中的数字向后移动一位,同时将这个下标用index记录下来。一直向前进行比较,一直到比较的数字小于要插入的数,或者比较到有序数组的开头位置,即下标为0的位置,将要插入的数据插入到下标index的位置。
下面是插入排序的一个案例

4133698756687
0123456

在刚开始排序时,将数组分成A:

41
0

B:

33698756687
123456

两个部分,其中A是有序的、B是无序的,下面要做到就是将无序数组B从下标1开始,将每个数据插入到有序数组A中

	1、当插入33时,由于33小于41,所以需要将33放入到41的位置,将33放入到33的位置。放置完成后,由于33所在的下标为0,前面已经没有可以比较的数据了,此时结束放置。这时A变成有两个数据的有序数组,无序数组B少了一个数据
3341
01
698756687
23456
	2、接着将无序数组的第一下标为2数据6插入到有序数组中,将6从有序数组的最后一个下标处开始比较,
		6<41,将41后移一位,6<33,将33后移一位。此时6在下标为0的位置,不需要进行比较,此时的数组如下:
63341
012
98756687
2345
	3.将98插入到有序数组中,
		98>41,因为A数组是有序的,所以比较结束,98的位置不变,成为有序数组的一部分
6334198
0123
756687
456
	4.将75插入到有序数组中
		75<98,将98后移一位,75>41,比较结束,将75放在98的位置,此时数组如下
633417598
01234
6687
56
	5.将66插入到有序数组A中,
		66<98,将98后移一位,66<75,将75后移一位,66>41,比较结束,将66放在44后的位置,此时数组如下
63341667598
012345
87
6
	6.将87插入到有序数组A中
		87<98,将98后移一位,87>75,比较结束,将87放在75后一个位置,此时数组如下
6334166758798
0123456
	7.无序数组中的数据完全插入到有序数组中,此时的数组即为有序的

代码如下所示

public void insertSort(int[] arr) {
		// 将当前下标所对应的数据插入到之前已经有序的数组中
		for (int i = 1; i < arr.length; i++) {
			// 要进行插入的数据
			int key = arr[i];
			//记录找比要插入的数大的结束的位置
			int index = i;
			// 从后向前找到比key大的值
			for (int j = i - 1; j >= 0; j--) {
				if (arr[j] <= key) {
					break;
				}
				// 找到比key的值,将它们都向后进行移动,因为key是需要插在有序数组中的某个位置处的
				arr[j + 1] = arr[j];
				index--;
			}
			arr[index] = key;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值