【问题标题】:Why doesn't the binary search method work if the array is sorted in descending order?如果数组按降序排序,为什么二进制搜索方法不起作用?
【发布时间】:2019-08-09 12:09:25
【问题描述】:

二分查找方法用于从已排序的数组中找出它没有做的值。我知道问题涉及按降序对其进行排序,但是有人可以帮我解决问题,但它不起作用。 如果有帮助,降序方法是一种选择排序。 我认为问题在于该方法只能从升序数组中找到值,但不知道如何使其在降序数组上工作

package project;

import java.io.*;
import java.util.*;
import java.util.Scanner;

public class project {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int Size;//size of the array
        int order; // ascending or descending order
        System.out.println("Put in the amount of expenses you have");
        Size = sc.nextInt();//User input for the amount of expenses
        System.out.println("put in all your expenses");
        int userInput[] = new int[Size];// what the users expenses are
        for (int i = 0; i < userInput.length; i++)//This loop is for if the i value is smaller than user input then put in more values to complete the array
            userInput[i] = sc.nextInt();
        System.out.println("do you want it ascending or descending order. If you want it in ascending press 1 or if you want descending press 2");
        order = sc.nextInt();// select if they wanted it in ascending or descending order
        System.out.print("expenses not sorted : ");
        printExpenses(userInput);
        if (order == 1) {
            expensesAscending(userInput);// If order is equal to one then sort in ascending else if it is equal to 2 then order it descending
        } else if (order == 2) {
            expensedescending(userInput);

        }
        int ans = binarySearch(userInput, 0, Size, 10);
        System.out.println(ans);
        if(ans == -1)
            System.out.println("Key not found");
          else
            System.out.println("Key found at position " + (ans));
    }

    public static void printExpenses(int[] arr) {
        // this is were it is printed
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "$");
        }
    }

    public static void expensedescending(int arr[]) {
        // This is were the selection sort starts
        int N = arr.length;
        for (int i = 0; i < N; i++) {
            int small = arr[i];
            int pos = i;
            for (int j = i + 1; j < N; j++) {
                if (arr[j] > small) {
                    small = arr[j];
                    pos = j;
                }
            }
            int temp = arr[pos];
            arr[pos] = arr[i];
            arr[i] = temp;
            System.out.println(": ");
            // Printing array after pass
            printExpenses(arr);
        }
    }

    public static void expensesAscending(int arr[]) {
        int N = arr.length;
        for (int i = 1; i < N; i++) {
            int j = i - 1;
            int temp = arr[i];
            while (j >= 0 && temp < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
                ;
            }
            arr[j + 1] = temp;
            System.out.println(": ");
            // Printing array after pass
            printExpenses(arr);
        }
    }
    static int binarySearch(int[] array, int left, int right, int key) {
        if (left > right) {
          return -1;
        }

        int mid = (left + right) / 2;

        if (array[mid] == key) {
          return mid;
        }

        if (array[mid] > key) {
          return binarySearch(array, left, mid - 1, key);
        }

        return binarySearch(array, mid + 1, right, key);
      }



}

【问题讨论】:

    标签: java sorting binary-search selection-sort


    【解决方案1】:

    您正在尝试在降序排序数组上使用升序排序数组的binary search。像这样更改您的 method header 和方法主体:

    int ans = binarySearch(userInput, 0, Size, 10,order);  // order you got from user 
    

    现在这个Binary search 将适用于数组的升序和降序:

        static int binarySearch(int[] array, int left, int right, int key,int sorting) 
        {
            if (left > right) 
            {
              return -1;
            }
    
            int mid = (left + right) / 2;
    
            if (array[mid] == key) 
            {
              return mid;
            }
    
            if(sorting == 2)   // if array is sorted in descending order
            {
                if (array[mid] > key) 
                {
                  return binarySearch(array, mid+1, right, key,sorting );
                }
                return binarySearch(array, left, mid-1, key,sorting );
            }
            else // if array is sorted in ascnending order
            {
                if (array[mid] > key) 
                {
                    return binarySearch(array, left, mid - 1, key,sorting );
                }
    
                return binarySearch(array, mid + 1, right, key,sorting );
            }
        }
    

    【讨论】:

      【解决方案2】:

      问题是你需要在上半部分搜索如果key小于中间元素。否则在下半部分搜索。

      static int binarySearch(int[] array, int left, int right, int key) {
          if (left > right) {
            return -1;
          }
      
          int mid = (left + right) / 2;
      
          if (array[mid] == key) {
            return mid;
          }
      
          if (array[mid] > key) {
            return binarySearch(array, mid + 1, right, key);
          }
      
          return binarySearch(array, left, mid - 1, key);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 2020-05-19
        相关资源
        最近更新 更多