【问题标题】:binary search with insertion sort插入排序的二分查找
【发布时间】:2021-09-20 10:51:48
【问题描述】:

将使用插入排序使用二进制搜索来查找值。编码新手,所以找不到解决方案。现在,如果我输入任何值,它不会使用插入并且找不到值。

#include <stdio.h>
int main()
{
int i, low, high, mid, n, key, array[100],size;
printf("Enter number of elements");
scanf("%d",&n);
printf("Enter %d integersn", n);
for(i = 0; i <= n-1; i++)
scanf("%d",&array[i]);
void insertionSort(int array[], int size) {
 for (int step = 1; step <= size-1; step++) {
   int key = array[step];
   int j = step - 1;

   while (key < array[j] && j >= 0) {
     array[j + 1] = array[j];
     --j;
   }
   array[j + 1] = key;
 }
}
  printf("%d\n",key);
  scanf("%d", &key);
  low = 0;
  high = n - 1;
  mid = (low+high)/2;
  while (low <= high) {
  if(array[mid] < key)
  low = mid + 1;
  else if (array[mid] == key) {
  printf("%d\n", key, mid+1);
  break;
}
  else
  high = mid - 1;
  mid = (low + high)/2;
}
  if(low > high)
  printf("%d\n", key);
  return 0;
}

【问题讨论】:

  • 您已经定义了嵌套在main 函数中的insertionSort 函数。 C 不支持嵌套函数定义。
  • 另外,您还没有在输入值后调用insertionSort 对数组的内容进行排序。数组元素值的二进制搜索仅在数组内容已排序时才有效。

标签: c binary-search insertion-sort


【解决方案1】:

我更正了你的代码。

#include <stdio.h>

void insertionSort(int array[], int size) {
    int key, j;
    for (int step = 1; step < size; step++) {
        key = array[step];
        j = step - 1;

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

int main()
{
    int i, low, high, mid, n, key, array[100],size;
    printf("Enter number of elements");
    scanf("%d",&n);
    printf("Enter %d integersn\n", n);
    for(i = 0; i <= n-1; i++){
        scanf("%d", &array[i]);
    }
    insertionSort(array, n);
    printf("Insert key\n");
    scanf("%d", &key);
    printf("%d\n",key);
    low = 0;
    high = n - 1;
    mid = (low+high)/2;
    while (low <= high) {
        if(array[mid] < key)
            low = mid + 1;
        else if (array[mid] == key) {
            printf("key: %d  mid: %d\n", key, mid+1);
            break;
        }
        else
            high = mid - 1;
        mid = (low + high)/2;
    }
    if(low > high)
        printf("%d\n", key);
    return 0;
}

我发现的问题是:

  1. 函数在 main 中(记住不能这样做),如果前面有声明,您可以将它放在 main 之后,或者放在 main 之前。
  2. 插入排序中的 for 保护错误,您必须输入 step 而不是 step
  3. 您认为每次在 for 中循环时都必须调用插入,因此只需在数组中插入所有元素后调用一次
  4. 您在扫描之前放置了 kay 的 printf,这会打印出随机的东西,因为变量的内容不干净。

希望能提供帮助。

【讨论】:

    【解决方案2】:

    问题是insertionSort 在输入元素后从未在数组上调用。相反,您已经在应该调用它的位置定义了函数insertionSort。在另一个函数中定义一个函数不是 C 语言的标准部分,但一些编译器可能支持它作为扩展。

    如果您将insertionSort 的定义移到main 函数之外,并添加对该函数的调用,则代码在修复几个printf 语句后工作。这是一个稍微整理的工作版本:

    #include <stdio.h>
    
    void insertionSort(int array[], int size) {
      for (int step = 1; step <= size-1; step++) {
        int key = array[step];
        int j = step - 1;
    
        while (key < array[j] && j >= 0) {
          array[j + 1] = array[j];
          --j;
        }
        array[j + 1] = key;
      }
    }
    
    int main()
    {
      int i, low, high, mid, n, key, array[100],size;
      printf("Enter number of elements: ");
      scanf("%d",&n);
      printf("Enter %d integers: ", n);
      for(i = 0; i <= n-1; i++)
        scanf("%d",&array[i]);
      insertionSort(array, n);
      printf("Enter key: ");
      scanf("%d", &key);
      low = 0;
      high = n - 1;
      mid = (low+high)/2;
      while (low <= high) {
        if(array[mid] < key)
          low = mid + 1;
        else if (array[mid] == key) {
          printf("%d found at %d\n", key, mid+1);
          break;
        }
        else
          high = mid - 1;
        mid = (low + high)/2;
      }
      if(low > high)
        printf("%d not found\n", key);
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多