簡體   English   中英

使用Binary Search Recursion將元素的插入位置返回到排序數組中

[英]Return the insert position of an element into a sorted array with Binary Search Recursion

我想從排序數組中返回某個元素的位置(如果該元素存在),否則我想返回應該插入該元素的插入位置。 這是我的代碼:

    public static int bs(int[] array, int left, int right, int elem) {
    if (left > right) {
        return left;
    } else {
        int middle;
        middle = (left + right) / 2;
        if (left == right) { // used to return the insert position
            return left;
        } else if (elem > array[middle]) {
            return bs(array, middle + 1, right, elem);
        } else if ((elem < array[middle])) {
            return bs(array, left, middle - 1, elem);
        } else {
            return middle; // element existed into array
        }
    }
}

例如:

array = [ 2 5 8 10], elem = 8 =>將返回2

array = [ 2 5 8 10], elem = 6 =>將返回1

array = [ 2 7 14 22 32 56 88 91 102], elem = 3 =>將返回1(但上面的程序返回0)

您的錯誤是從bs(left,middle-1)的拆分中刪除array [middle]。 相反,您需要使用bs(left,middle)bs(middle+1,right) 我將打印添加到遞歸調用中,並輕松找到它。

public static int bs(int[] array, int left, int right, int elem) {
    System.out.println("["+left+", "+right+"]");
    if (left > right) {
        return left;
    } else {
        int middle;
        middle = (left + right) / 2;
        if (left == right) { // used to return the insert position
            return left;
        } else if (elem > array[middle]) {
            return bs(array, middle + 1, right, elem);
        } else if ((elem < array[middle])) {
            return bs(array, left, middle, elem); //<-- was: middle-1
        } else {
            return middle; // element existed into array
        }
    }
}

我也認為這種風格會更好;)

public static int bs2(int[] array, int left, int right, int elem) {
    System.out.println("["+left+", "+right+"]");
    if (left >= right)
        return left;

    int middle;
    middle = (left + right) / 2;
    if (elem > array[middle])
        return bs(array, middle + 1, right, elem);
    if ((elem < array[middle]))
        return bs(array, left, middle, elem); //<--- was: middle-1
    return middle; // element existed into array
}

我希望我沒錯。 這是我的第一篇文章,所以請對我寬恕:)。

起初我認為array = [2 5 8 10],elem = 6 =>將返回2將是正確的,因為6> 5它將具有索引2。還是您想用6代替5? 如果要替換,請刪除我的注釋的“ //”。

public static int getPosition(int[] arr, int value)
{
    int position = 0;

    for (int i = 0; i < arr.length; i++)
    {
        if (arr[i] == value)
        {
            position = i;
            break;
        } else
            position = -1;
    }

    if (position == -1)
    {
        int[] arr2 = new int[arr.length + 1];
        System.arraycopy(arr, 0, arr2, 0, arr.length);
        arr2[arr.length] = value;

        Arrays.sort(arr2);
        position = getPosition(arr2, value);//-1;
    }
    return position;
}

public static void main(String[] args)
{

    int[] arr = { 2, 5, 8, 10 };

    System.out.println(getPosition(arr, 6));

}
public static int searchInsert(int[] nums, int target) {

  if(target>nums[nums.length-1]){
      return nums.length;
  }
  else{
        for(int i=0;i<nums.length;i++){
            if(target==nums[i]){

              return i;
            }

           else{
               if(nums[i]>target){

                 return i;
               }
           }
        }
  }
   return 0; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM