算法导论学习心得1-----插入排序及两种不同插入方法的效率比较

插入排序的思想不多说了,就和打扑克牌时一样,拿到一张牌时从左到右比较后插入,不同的地方在于我们插入扑克牌是不用考虑移动顺序的。

按照书上第一个算法的代码,插入排序的算法如下:

插入排序1:

<span style="white-space:pre">		</span>int key,j;
		for (int i = 1; i < a.length; i++) {
			key=a[i];
			j = i-1;
			while (j>=0 && a[j]>key){
				a[j+1] = a[j];
				j--;
			} 
			a[j+1] = key;
		}
上述代码的思想是:当插入第i个数时,将其相前进行比较,当比较到比这个数小时,插入该数,并将刚刚比较过的数进行后移。
而自己实践时再写了另一个算法如下:

插入排序2:

		for (int i = 1; i < b.length; i++) {//排序第i个元素
			int order = i;
			int key2 = b[i];
			for (int j2 = 0; j2 < i; j2++) {//查找插入的位置
				if(b[j2]>key2){
					order = j2;
					break;
				}
			}
			for (int j2 = i; j2 >order; j2--) {
				b[j2]=b[j2-1];
			}
			b[order]=key2;
		}
上述代码的思想是:当排序第i个元素时,先从头开始比较,找到其相应的位置后,对已经排序好的这些数进行移位操作。

两种方法比较:代码2的效率明显不如代码1,方法二对于排序好的数据依旧会有多次比较。

坑爹的eclipse啊,在写时

发现一个很奇怪的问题,写记下,程序代码如下:

package main;

import util.MRand;
import util.MTime;

public class InsertSort {
	public static void main(String[] args) {
		int num=10;
		int size = 10000;
		while(num>0){//统计10次结果
			int a[] = MRand.getRandInt(size);//获取size个随机数
			int b[] = MRand.getRandInt(size);
			//插入排序1
			int key=0,j=0;
			MTime.setStartTime();
			MTime.getDValue();
			for (int i = 1; i < a.length; i++) {
				key=a[i];
				j = i-1;
				while (j>=0 && a[j]>key){
					a[j+1] = a[j];
					j--;
				} 
				a[j+1] = key;
			}
			MTime.getDValue("书上方法用时:");
			for (int i = 1; i < b.length; i++) {
				key=b[i];
				j = i-1;
				while (j>=0 && b[j]>key){
					b[j+1] = b[j];
					j--;
				} 
				b[j+1] = key;
			}
			MTime.getDValue("书上的方法用时2:");
			num--;
		}
		
	}
}


两个一模一样的算法,我统计了10次(最外的while循环),结果每次都像下这样

0
书上方法用时:82
书上的方法用时2:88
0
书上方法用时:54
书上的方法用时2:17
0
书上方法用时:61
书上的方法用时2:19
0
书上方法用时:58
书上的方法用时2:13
0
书上方法用时:64
书上的方法用时2:19
0
书上方法用时:55
书上的方法用时2:14
0
书上方法用时:63
书上的方法用时2:14
0
书上方法用时:55
书上的方法用时2:14



可以发现,在第二次循环后一样的方法,在第二次时速度就更快了。然而,在黑框框中编写时时能够得到近乎一样的


谁知道留个言告知一声啊



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值