Не удается получить желаемый результат этой программы двоичного поиска на языке си

#arrays #c #function #error-handling #binary-search

Вопрос:

От нас требуется выполнить две функции: 1] Сортировка пузырьков и 2] Двоичный поиск. Если элемент не принадлежит массиву, функция 2]nd должна возвращать значение -1. В основной функции мы получаем входные данные, и если элемент не находится в массиве, мы должны вывести «Элемент не найден». Я написал программу в соответствии с особенностями, которые были заданы в вопросе.

1] — я функция, сортировка пузырьков работает нормально, но 2] — я функция выдает только «Элемент не найден» в качестве вывода, независимо от значения. Пожалуйста, предложите решение.

 void bubbleSortDec(int arr[10])
{
    int i=0,j=0,temp=0;
    for(i=0;i<9;i  )
    {
        for(j=0;j<9-i;j  )
        {
            if(arr[j]<arr[j 1])
            {
                temp=arr[j];
                arr[j]=arr[j 1];
                arr[j 1]=temp;
            }
        }
    }
}

int binarySearch(int arr[10], int x)
{
    bubbleSortDec(arr);
    int first, last=0, middle=0;
    first = 0;
  last = 10 - 1;
  middle = (first last)/2;

  while (first <= last) {
    if (arr[middle] < x)
      first = middle   1;
    else if (arr[middle] == x) {
      printf("%d found at location %d.n", x, middle 1);
      break;
    }
    else
      last = middle - 1;

    middle = (first   last)/2;
  }

  if (first > last)
    {
        return -1;
    }
 }   

int main()
{
        int arr[10];
        int i, x,k=0;
        printf("Enter 10 numbers n");
        for(i=0; i<10;i  )
            {
                scanf("%d", amp;arr[i]);
            }
        printf("Enter a number to be searched n");
        scanf("%d", amp;x);

            k=binarySearch(arr,x);
            if(k==-1)
                printf("Element not found n");
    }

 

Комментарии:

1. Вы сортируете массив в порядке убывания, но поиск ожидает, что он будет в порядке возрастания.

2. Двоичный поиск требует отсортированного ввода, но вызов пузырьковой сортировки каждый раз, когда вы просматриваете элемент в массиве, кажется немного излишним. И вы, вероятно, захотите вернуть индекс или около того, если поиск будет успешным.

Ответ №1:

Ваша сортировка пузырьков сортирует массив в порядке убывания. Конечно, это не проблема, вы все еще можете использовать этот способ, но вам нужно изменить свой двоичный поиск. Проблема вот в чем.

Предположим, у вас есть массив, который отсортирован в порядке убывания, и допустим, вы ищете 17.

 65 54 32 17 9
 

Чем вы ищете элемент midde, который равен 32. В вашем коде, если элемент, который вы ищете, меньше среднего элемента, вы продолжаете поиск в нижней части массива. Но в данном случае это неправильно. Потому что элементы, которые находятся в нижней части массива, больше, чем средний элемент. Вам нужно искать верхнюю часть массива.

Так что у вас есть два варианта.

Сначала вы можете изменить сортировку пузырьков, чтобы отсортировать массив в порядке возрастания.

 void bubbleSortDec(int arr[10])
{
    int i=0,j=0,temp=0;
    for(i=0;i<9;i  )
    {
        for(j=0;j<9-i;j  )
        {
            if(arr[j]>arr[j 1]) // Change is here. (this "<" to this ">")
            {
                temp=arr[j];
                arr[j]=arr[j 1];
                arr[j 1]=temp;
            }
        }
    }
}
 

Или вы можете изменить свой двоичный поиск на этот.

 int binarySearch(int arr[10], int x)
{
    bubbleSortDec(arr);
    int first, last=0, middle=0;
    first = 0;
  last = 10 - 1;
  middle = (first last)/2;

  while (first <= last) {
    if (arr[middle] > x) // Change is here. (this "<" to this ">")
      first = middle   1;
    else if (arr[middle] == x) {
      printf("%d found at location %d.n", x, middle 1);
      /*
      Returning anything except "-1" is okey. Because you only check for "-1".
      */
      return middle;
    }
    else
      last = middle - 1;

    middle = (first   last)/2;
  }
  /*
  If you couldn't find the element in while loop that 
  means the element is not in the array. You don't need to check it again.
  */
  return -1;
 }
 

И, наконец, я написал тот же код таким образом.

 #include <stdio.h>

#define SIZE 10

void swap(int *i1, int *i2) {
    int temp = *i1;
    *i1 = *i2;
    *i2 = temp;
}

void bubbleSort(int arr[SIZE]) {
    
    int i, j;
    for (i = 0; i < SIZE; i  ) {
        for (j = 0; j < SIZE - i - 1; j  ) {
            if (arr[j] > arr[j   1]) swap(arr   j, arr   j   1);
        }
    }
    
    return;
}

int binarySearch(int arr[SIZE], int x) {
    
    int first = 0, last = SIZE - 1;

    while (first <= last) {
        int middle = (first   last) / 2;

        if (arr[middle] == x) {
            return middle;
        } else if (x < arr[middle]) {
            last = middle - 1;
        } else {
            first = middle   1;
        }
    }

    return -1;
}   

int main() {
    
    int arr[SIZE];
    printf("Enter %d numbers n", SIZE);

    int i; for(i = 0; i < SIZE; i  ) scanf("%d", arr   i);

    printf("Enter a number to be searched n");
    int x;
    scanf("%d", amp;x);

    bubbleSort(arr);
    int k = binarySearch(arr, x);
    
    if (k == -1) printf("Element not found!n");
    else printf("Element found at index %d.n", k   1);

    return 0;
}