插入排序

插入排序

image-20210316140513730

要把7放入:首先我前面的已经排好序了,拿到一个新的7。

先与10比,比十小肯定插在十的前面。再和5比,比5大肯定插在5的后面。

从小到大,遇到比我大的就往前走,直到遇到比我小的我就在这个后面。"欺小怕大"

代码:

	private static void insertSort(int[] arr) {
		// TODO Auto-generated method stub
		//开始摸牌,从上到小一张一张的去摸
		for (int i = 0; i < arr.length; i++) {
//			这张牌的点数是arr[i];
//			手上的牌0~i-1
			int lastIndex = i -1;//原有手牌最后一张的位置
			int v = arr[i]; //新手牌,因为往后挪动会覆盖掉原有的值
			while(lastIndex>=0&&v<arr[lastIndex]) {
				arr[lastIndex+1] = arr[lastIndex];
				lastIndex--;//比完之后最末的一张要往前挪
			}
            //lastIndex ==-1 或者新手牌更大了
			//新手牌插入
			arr[lastIndex+1] = v;
			
		}
	}

总结:

1.Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1

while(v<arr[lastIndex]) {
				arr[lastIndex+1] = 		arr[lastIndex];
				lastIndex--;//比完之后最末的一张要往前挪
			}

因为我们有一次会很不幸的把这个lastIndex赋值为-1,比如下面当比到第一项2的时候,此时lastIndex = 0,然而计算机并不知道前面没有了,所以lastIndex - 1 = -1。

image-20210316200003855

添加约束条件lastIndex>=0

2.检验每个语句中是否下标越界

int v = arr[i]; //新手牌,因为往后挪动会覆盖掉原有的值

这里i的范围是0~length-1,不会越界。

int lastIndex = i -1;//原有手牌最后一张的位置

lastIndex不停在减少,要限制它大于等于0。

	//最后一个手牌的位置+1才是新手牌插入的位置
			arr[lastIndex+1] = v;

进入这一句话说明lastIndex ==-1 或者新手牌更大了。因为while循环(while(lastIndex>=0&&v<arr[lastIndex]))之后说明已经不满足前面的那个大于新插入的这个。将其插入到不满足的后边那个即可

image-20210316201223207

posted @ 2021-03-16 20:14  记录学习Blog  阅读(63)  评论(0)    收藏  举报