由于您处理的是数组而不是链表,因此将最后一个元素与中间元素交换是不够的。您必须移动数组的整个部分(例如使用 System.arraycopy)。所以这是我的版本:
public static void main(String[] args) {
String[] dict = {"this", "cases", "animal", "barter", "animal",
"file", "code", "dictionary", "simon", "crazy"};
for (int out = 1; out < dict.length; out++) {
String temp = dict[out];
int indexToInsert = binarySearch(dict, 0, out - 1, temp);
if (indexToInsert < out) {
// Next call copies elements [indexToInsert, out-1]
// to elements [indexToInsert+1, out] (shift to the right)
System.arraycopy(dict, indexToInsert, dict,
indexToInsert + 1, out - indexToInsert);
dict[indexToInsert] = temp;
}
}
//status = "sorted";
for(String v: dict){
System.out.println(v);
}
}
public static int binarySearch(String[] dict, int lowerBound,
int upperBound, String value) {
while (lowerBound <= upperBound){
int curIn = (lowerBound + upperBound)/2;
int compRes = dict[curIn].compareTo(value);
// compRes reflects relation between dict[curIn] and value from
// input parameters. compRes is {-1,0,+1} for cases when
// dict[curIn] {<,=,>} value correspondingly. For details see:
// http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo(java.lang.String) .
if (compRes == 0) {
return curIn;
} else if (compRes > 0){
upperBound = curIn - 1;
} else {
lowerBound = curIn + 1;
}
}
return lowerBound;
}
另一种方法是使用二进制搜索的标准java实现:
public static int binarySearch(String[] dict, int lowerBound,
int upperBound, String value) {
int ret = Arrays.binarySearch(dict, lowerBound, upperBound + 1, value);
return (ret < 0) ? -ret - 1 : ret;
}