二进制搜索的插入排序无法正常工作

时间:2015-09-28 22:31:12

标签: java binary-search insertion-sort

这是代码

for(out=1; out< dictSize; out++){
   String temp = dict[out];
   in=out;
   int lowerBound = 0;
   int upperBound = in-1;
   int curIn;  

   while (lowerBound <= upperBound){
      curIn = (lowerBound+upperBound)/2;
      if(dict[curIn].compareTo(temp) > 0){
           dict[in] = dict[curIn]; 
           dict[curIn]=temp;
           upperBound = curIn-1;
       } else{
           if(dict[curIn].compareTo(temp) < 0){
                 lowerBound=curIn + 1;
            }  
       }         
    }
 }

 //status = "sorted";
 for(String v: dict){
      System.out.println(v);
 }

这是输出没有正确排列:

animal

animal

barter

cases

code

dictionary

file

simon

this

crazy

出了什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

由于您处理的是数组而不是链表,因此它不足以与中间元素交换最后一个元素。您必须移动整个数组(例如使用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;
}