插入排序算法

好久没有看算法了,稍微看了下,次哦,变笨了

算法里面最基本的方法:插入排序

假定有一组数据:A1,A2,A3,A4…..An

要求重新排序输出:B1,B2,B3,B4…..Bn 按照从大到小的顺序。

实现方法,假定有数组a[0…n]

1.先认为a[0]是有序的,那么a[1…n]是无序区

2.另i=1,我们把a[i]作为当前的key值插入到a[0…i-1]这个有序区间里面去,形成了有序区间a[0…i]

3.i=i+1,继续把当然的a[i](此时的i已经自加了1,第二步是i=1的话,此时i=2)作为当前的key插入到上一步形成的a[0…i-1]的区间里面,就这样不停的重复第二部,直到i=n.

伪码后面补上!

下面是JAVA代码:

public static int[] sort(int[] num) {

		int i, j, key;
		for (i = 1; i < num.length; i++) {
			// 因为第一个数据我们认为自成有序序列,所以要从第二个位置(下标为1)遍历其他的所有数据,插入这个有序序列,扩充它,直到所有的元素都遍历完
			// 记录key值,要把它插入到这个key值前面的有序序列

			key = num[i];
			for (j = i - 1; j >= 0; j--) {
				if (key > num[j]) {// 找到比我们要插入的key值小的数值,这个数值后面的一个位置:j+1就是要把key值插入的位置,此时跳出循环,已经找到要插入的位置了

					break;
				}
			}

			if (j != i - 1) {// 判断条件,如果发现我们现在的key值的前一个位置的值就比我们的key值小,那就是说key值不用移动,就和前面的有序序列是保持一致的,不用去插入它,那我们就不需要处理,继续进行这个key后面的数值的处理

				for (int k = i; k > j + 1; k--) {
					{// 现在知道了要插入的位置是j+1这个位置,那么需要把j+1到i-1之间的数据统一后移一个位置,腾出j+1这个位置,
						// 要插入我们要移动的那个key值,原来i的位置,被i-1这个位置的数字占据,依次类推,每个都向后移动一个位置,直到j+1被腾出来
					}
					System.out.println(k);
					num[k] = num[k - 1];
				}
				num[j + 1] = key;// 把我们要插入的key值,插入到腾出来的j+1这个位置
			}

		}
		return num;
	}



上面的做法是找到要插入的位置,然后我们去移动这个位置后面的元素,再插入数据,我们可以直接在搜素的同时,就开始移动:

public static int[] sort2(int[] num) {
		int len = num.length;
		int i, j, key;
		for (i = 1; i < num.length; i++) {// 同样认为第一个元素自成有序序列,把后面的元素加入这个序列,扩充他
			key = num[i];// 记录当前要插入到前面有序序列里面的值,当前的位置是i
			for (j = i - 1; j >= 0 && key < num[j]; j--) {// 把当前的值和前面的数值挨个比较,从i-1开始和i位置的这个key值比较,挨个往前,如果发现key值比前面一个位置的数值小,
															// 就把前面一个数值往后面移动一位,继续把key值和前面的比较,直到发现key值当前所在位置前面的数值
															// 比我们的key值小了,那就停止移动了.这个时候比方说我们发现X位置的值比它小,X后面的位置是我们要插入的位置,而此时X后面的那个数值是已经被移到X+1的位置了
				num[j + 1] = num[j]; // 停止查找,跳出循环,在X+1位置插入key值,这
										// 个就是移动一边查找合适的插入位置。

			}
			num[j + 1] = key;

		}
		return num;
	}



次哦··变笨了··好难理解··

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值