本帖最后由 罗玉宁 于 2013-3-9 02:00 编辑
这是Java内部 关于数组排序的一些代码,看红色部分
public static void sort(int[] a) {
sort1(a, 0, a.length);
}
private static void sort1(int x[], int off, int len) {
// Insertion sort on smallest arrays
if (len < 7) {
for (int i=off; i<len+off; i++)
for (int j=i; j>off && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}
// Choose a partition element, v
int m = off + (len >> 1); // Small arrays, middle element
if (len > 7) {
.......
}
}
private static void mergeSort(Object[] src,
Object[] dest,
int low,
int high,
int off) {
.....
int mid = (low + high) >>> 1;
......
}
同样的关于位运算在其他的很多算法中会用到,只不过我们接触的较少。
难道我还要自已先算下左移多少位啊?
不是的,位运算只是一种运算方式,在某些运算中可以提高效率.就像加减乘除一样,只是一种运算的方式我们可以用可以不用。不一定要刻意的用。就像你问题中的提问一样
2*8我们可以用2<<3 来算,这是因为数据简单我们一目了然,对于2*999999我们不知道移动多少位,我们为什么还要移位直接用乘法算就行了呗。 |