插入排序的思想不多说了,就和打扑克牌时一样,拿到一张牌时从左到右比较后插入,不同的地方在于我们插入扑克牌是不用考虑移动顺序的。
按照书上第一个算法的代码,插入排序的算法如下:
插入排序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
可以发现,在第二次循环后一样的方法,在第二次时速度就更快了。然而,在黑框框中编写时时能够得到近乎一样的。
谁知道留个言告知一声啊