直接插入排序和二分插入排序的主要区别就在元素之间判断总次数多少上。
1. 直接插入排序代码:
public static void insertSort(int[] value
,int length
){
int temp
;
for(int i
=1;i
<length
;i
++){
temp
=value
[i
];
int j
=i
-1;
while(j
>=0&&value
[j
]>temp
){
insertSortCompareCount
++;
value
[j
+1]=value
[j
];
j
--;
}
value
[j
+1]=temp
;
}
}
2. 二分插入排序代码:
public static void insertSort2(int[] value
,int length
){
for(int i
=1;i
<length
;i
++){
int left
= 0;
int right
= i
-1;
int temp
= value
[i
];
while(left
<=right
){
insertSort2CompareCount
++;
int mid
= (left
+right
)/2;
if(value
[mid
]>temp
)
right
=mid
-1;
else
left
=mid
+1;
}
for(int j
=i
-1;j
>=left
;j
--){
value
[j
+1]=value
[j
];
}
value
[left
]=temp
;
}
}
直接插入排序和二分插入排序的区别在与找到待插入位置所判断的次数,所以可以比较它们比较的次数。
3. 主函数代码:
public static void main(String
[] args
){
int[] s1
= new int[size
];
for(int i
=0;i
<size
;i
++){
s1
[i
]=Math
.abs(rand
.nextInt()%1000);
}
int[] s2
= Arrays
.copyOf(s1
,size
);
System
.out
.println(Arrays
.toString(s1
));
long isTimeStart
=System
.nanoTime();
insertSort(s1
,s1
.length
);
long isTimeEnd
=System
.nanoTime();
long is2TimeStart
=System
.nanoTime();
insertSort2(s2
,s2
.length
);
long is2TimeEnd
=System
.nanoTime();
System
.out
.println(Arrays
.toString(s1
));
System
.out
.println(Arrays
.toString(s2
));
System
.out
.println("数组大小:"+size
);
System
.out
.println("直接插入排序判断了: "+insertSortCompareCount
+"次"+" 用时:"+(isTimeEnd
-isTimeStart
));
System
.out
.println("二分插入排序判断了: "+insertSort2CompareCount
+"次"+" 用时:"+(is2TimeEnd
-is2TimeStart
));
}
3. 运行结果:
1> 2> 3> 4> 5> 6>
5. 总结:
直接插入排序与二分插入排序的主要区别就在寻找待插入位置的快慢,因为对数组的移动没有太大的区别,所以这个快慢主要还是体现在判断次数上。
从运行结果可以看出,大多数时候,二分插入排序判断次数,运行时间都优于直接插入排序。但也存在一些意外,如图3,4,5,虽然判断次数都优于直接插入排序,但是运行时间却比它慢,并且,通过反复运行,可以发现,这种情况主要出现在数组大小比较小的时候,在数组比较大的情况下,普遍是二分插入在判断次数,以及运行时间上都优于直接插入排序。