看java源代码,发现Arrays.sort()方法里面求数组的中间索引使用的是length >> 1,这是啥原理?谢谢!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看java源代码,发现Arrays.sort()方法里面求数组的中间索引使用的是length >> 1,这是啥原理?谢谢!相关的知识,希望对你有一定的参考价值。
参考技术A 左移一位相当于乘2,右移一位相当于除2.length属性里面放的是数组的长度。除2不就求出数组的中间索引了。本回答被提问者采纳 参考技术B length是整个数组的长度。如果右移一位代表除以2,那么不就是中间的索引了吗?比如数组长度为5,那么中间索引2. 参考技术C 数组的length是整型,整型右移除以2 参考技术D 没研究过,莫非里面的长度用的二进制,使用位移来改变索引位置?我也等等答案。 第5个回答 2011-10-08 右移以为等于length处以2 正好在中间啊 你看看按位运算就知道了
jdk8源码Arrays.sort插入排序
最近再看数据结构与算法相关的书籍,想着看有没有什么现实中应用的案例结果就在jdk源码中发现了插入排序的身影。
插入排序的核心思想;
插入排序(insertionsort)算法适用于包括向量与列表在内的任何序列结构。算法的思路可简要描述为:始终将整个序列视作并切分为两部分:有序的前缀,无序的后缀;通过迭代,反复地将后缀的首元素转移至前缀中。
由此亦可看出插入排序算法的不变性:
Z在任何时刻,相对于当前节点e = S[r],前缀S[0, r)总是业已有序
在任何时刻,当前节点以前的数据都是有序的,后面是无序的可以看一个简单的案例;
所以总结算法就是如何对已经遍历的数据进行插入排序的问题,核心思想我们都知道了,看看jdk大佬怎么写的
int list8[] = {44, 22, 33, 11};
Arrays.sort(list8);
跟踪代码,可以找到
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
if (length < INSERTION_SORT_THRESHOLD) {当长度小于47时进行插入排序
if (leftmost) {
/*
* Traditional (without sentinel) insertion sort,
* optimized for server VM, is used in case of
* the leftmost part.*/
for (int i = left, j = i; i < right; j = ++i) {
int ai = a[i + 1];取出当前节点的下一个节点
while (ai < a[j]) {在已经排好序的数字中,选择一个正确位置进行插入,
a[j + 1] = a[j]; 大的数字往后移动一位
if (j-- == left) {指针左移一位,直到找到该插入的位置。这种做法也避免了没必要的遍历。
break;
}
}
a[j + 1] = ai;
}
} else {
/*其他代码
虽然代码不长,但是也是通过自己写的测试案例,简单跟踪了下代码,才理解了这段插入排序的代码,对于这段代码,其实对于一个逆序数组来说,其实时间复杂度还是O(n2),这个通过两层循环也可以看出。
以上是关于看java源代码,发现Arrays.sort()方法里面求数组的中间索引使用的是length >> 1,这是啥原理?谢谢!的主要内容,如果未能解决你的问题,请参考以下文章
为啥 java.util.Arrays.sort(Object[]) 使用 2 种排序算法?