Java 制作二进制搜索函数

Java 制作二进制搜索函数,java,sorting,binary-search,insertion-sort,Java,Sorting,Binary Search,Insertion Sort,我正在做一个家庭作业,我应该做一个函数来进行二进制插入排序,但我的函数似乎不能正常工作 在这里,我尝试将二进制搜索函数与插入排序函数相结合(在家庭作业任务中指定,它需要以函数的形式出现:insertionSort(int[]数组,int lo,int hi)) 公共静态void insertionSort(int[]数组、int-lo、int-hi){ int mid; int pos; for(int i=1;i

我正在做一个家庭作业,我应该做一个函数来进行二进制插入排序,但我的函数似乎不能正常工作

在这里,我尝试将二进制搜索函数与插入排序函数相结合(在家庭作业任务中指定,它需要以函数的形式出现:insertionSort(int[]数组,int lo,int hi))

公共静态void insertionSort(int[]数组、int-lo、int-hi){
int mid;
int pos;
for(int i=1;i阵列[mid]){
lo=中间+1;
}
else if(xpos;j--){
数组[j]=数组[j-1];
}
数组[pos]=x;
}
}
如果我尝试使用列表{2,5,1,8,3}运行它,输出将是

2 5 1 3 1(如果lohi)

2 5 3 8 5(如果低==高)

但我期待的是一个排序列表。。。
知道我做错了什么吗?

每当我需要二进制搜索时,我的函数如下所示:

public static void binarySearch(int arr[], int first, int last, int key){  
           int mid = (first + last)/2;  
           while( first <= last ){  
              if ( arr[mid] < key ){  
                first = mid + 1;     
              }else if ( arr[mid] == key ){  
                System.out.println("Element is found at index: " + mid);  
                break;  
              }else{  
                 last = mid - 1;  
              }  
              mid = (first + last)/2;  
           }  
           if ( first > last ){  
              System.out.println("Element is not found!");  
           }  
         }  

我希望我能帮助你

给你一个可能的想法:

public static void insertionSort(int[] array) {
    if (array.length <= 1) {
        return;
    }

    // Start with an initially sorted part.
    int loSorted = array.length - 1;
    //int hiSorted = array.length;

    while (loSorted > 0) {

        // Take one from the array
        int x = array[0];

        // Where in the sorted part to insert?
        int insertI = insertPosition(array, loSorted);

        // Insert x at insertI
        ...
        --loSorted;
    }
}
公共静态void insertionSort(int[]数组){
如果(数组长度0){
//从数组中取一个
int x=数组[0];
//要插入的已排序零件的哪个位置?
int insertI=insertPosition(数组,loSorted);
//在插入处插入x
...
--洛索特;
}
}

谢谢您的意见。我稍微改变了一下功能,现在似乎可以正常工作了

`公共静态void insertionSort(int[]数组、int-lo、int-hi){ int mid; int pos

    for (int i = 1; i < array.length; i++) {
        int j = i -1;   
        int x = array[i]; 

        while (lo <= hi) {
            mid = lo + (hi -lo)/2;

            if (x == array[mid]) {
                pos = mid; 
                break; 
            }
            if (x > array[mid]) {
                lo = mid+1; 
            }
            else if (x < array[mid]) {
                hi = mid-1; 
            }
        }

        while (j >= 0 && array[j] > x) { 
            array[j + 1] = array[j]; 
            j = j - 1; 
        } 
        array[j + 1] = x;  
    }
}
for(int i=1;i=0&&array[j]>x){
数组[j+1]=数组[j];
j=j-1;
} 
数组[j+1]=x;
}
}

问题似乎在于最后一部分,我试图将元素移动到正确的位置。函数可能并不完美,因此欢迎建设性的批评:)

子数组
array[lo..hi]
必须为二进制搜索排序,因此最初为空/1 lo==hi==array.ength-1?我想你需要重新开始,考虑一下算法。我认为这里的lo或hi应该是不同的
    for (int i = 1; i < array.length; i++) {
        int j = i -1;   
        int x = array[i]; 

        while (lo <= hi) {
            mid = lo + (hi -lo)/2;

            if (x == array[mid]) {
                pos = mid; 
                break; 
            }
            if (x > array[mid]) {
                lo = mid+1; 
            }
            else if (x < array[mid]) {
                hi = mid-1; 
            }
        }

        while (j >= 0 && array[j] > x) { 
            array[j + 1] = array[j]; 
            j = j - 1; 
        } 
        array[j + 1] = x;  
    }
}