想法上来说二分要比直接插入排序速度快,可是我测试一下结果却不是这样的,希望有人指点迷津,下面上代码
直接插入排序代码:
public static int[] insertionSort(int[] arr) {
int i, j, newValue;
for (i = 1; i < arr.length; i++) {// begin at the second element
newValue = arr[i];
j = i;
while (j > 0 && arr[j - 1] > newValue) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = newValue;
}
return arr;
}
二分插入排序代码:
public static int[] binaryInsertSort(int[] data){
int temp;
int low, mid, high;
for (int i = 1; i < data.length; i++) {
temp = data[i];
// 在待插入排序的序号之前进行折半插入
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (temp < data[mid])
high = mid - 1;
else
// low=high的时候也就是找到了要插入的位置,
// 此时进入循环中,将low加1,则就是要插入的位置了
low = mid + 1;
}
//找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动
for (int j = i; j >= low + 1; j--){
data[j] = data[j - 1];
}
// low已经代表了要插入的位置了
data[low] = temp;
}
return data;
}
测试代码:
int[] data = new int[100000];
for(int i=0; i<=99999; i++){
data[i] = 99999-i;
}
long begin = System.currentTimeMillis();
binaryInsertSort(data);
long end = System.currentTimeMillis();
System.out.println("插入用时为:" + (end - begin)+"ms");
结果:二分时候时间:插入用时为:10160ms。
直接插入时间:插入用时为:4629ms。
我又换成1万数据,结果还是这样,换成1万内的随机数据,结果依然,二分比直接慢了一倍左右。
问了一下,有的人说是数据量太少,不足以展示二分的优势,我觉得可能是二分的时候内循环比直接插入多了(二分查找这些循环)
在这里贴出来,希望有人能解答一下,谢谢!
------解决方案--------------------
“不具有随机性”的意思是,你的数组数据已经是完全逆序的了,对于某些算法可能会走极端,因而不具备一般性。