当前位置: 首页 > 知识库问答 >
问题:

仅将数组长度作为参数的递归合并排序

夏弘义
2023-03-14

我基本上理解了包含数组、低整数和高整数的递归合并排序函数。然而,我很好奇地试图编写一个只包含数组长度的递归合并排序函数。签名是:valmerge_sort(int*ray, int n);这比我想象的要困难得多。

我将在下面发布代码,但我的函数(我认为)只是为每次调用merge_sort()拆分数组的前半部分,本质上不涉及数组的后半部分(我认为也是如此)。

我遇到的另一个问题是,当将所有内容从辅助数组复制回原始数组(使用for循环)时,我不确定使用什么作为循环的初始条件。下面是我写的递归合并排序,它接受一个低值和一个高值,然后下面是只接受长度的merge_排序。

// Takes in low and high value
void merge_sort(int *array, int lo, int hi)
{
  int mid = lo + (hi - lo) / 2, i = lo, j = mid + 1, k = 0;

  // Auxiliary to store sorted values.
  int *aux = NULL;

  // Base case.
  if (lo >= hi)
    return;

  // Recursive calls.
  merge_sort(array, lo, mid);
  merge_sort(array, mid + 1, hi);

  // Mergy merge.
  aux = malloc(sizeof(int) * (hi - lo + 1));

  if (aux == NULL)
    return;

  while (i <= mid || j <= hi)
  {
    if (i > mid || j <= hi && array[j] < array[i])
      aux[k++] = array[j++];
    else
      aux[k++] = array[i++];
  }

  // Copy everything from the auxiliary array back into the original array.
  for (i = lo; i <=hi; i++)
    array[i] = aux[i - lo];

  free(aux);
}
// Takes in length of the array.
// This is very wrong, but I quickly tried to rewrite
// how I originally tried to tackle this problem
// when I first attempted it for this post.
void merge_sort(int *array, int n)
{
  // Auxiliary to store sorted values.
  int *aux = NULL;

  // Base case. Single element left in the array.
  if (n/2 < 1)
    return;

  // Recursive calls.
  // First call should take in the first half of the array.
  merge_sort(array, n/2);
  // This call should set the base address of the array 
  // to the midpoint of the array.
  merge_sort(array + n/2, n/2);

  // Mergy merge.
  aux = malloc(sizeof(int) * (n + 1));

  if (aux == NULL)
    return;

  while (i <= n/2 || j <= n)
  {
    if (i > n/2 || j <= n && array[j] < array[i])
      aux[k++] = array[j++];
    else
      aux[k++] = array[i++];
  }

  // Not sure how to write this part of the function correctly. 
  // Low is changing with each call to 
  // merge_sort(array, lo, hi), but in this function there is 
  // no lo variable
  //for (i = *lo*; i <= n; i++)
  //  array[i] = aux[i - lo];

  free(aux);
}

编辑:我的目标是在调用合并排序时尝试消除任何偏离一的错误。

共有1个答案

阳修永
2023-03-14

这是我的变化//@

#include<stdlib.h>
#include<stdio.h>
void printArr(int*arr,int n,char c){
  printf("array of size %d: ",n);
  for (int i = 0; i < n; i++)
  {
    printf("%d ",arr[i]);
  }
  printf("%c",c);
}
void merge_sort(int *array, int n)
{
  // Auxiliary to store sorted values.
  int *aux = NULL;

  // Base case. Single element left in the array.
  if (n/2 < 1)
    return;

  // Recursive calls.
  // First call should take in the first half of the array.
  merge_sort(array, n/2);
  // This call should set the base address of the array 
  // to the midpoint of the array.

  //@ till the end of the array: n - n / 2 (for odd initial size of array)
  merge_sort(array + n/2, n -n/2);

  // Mergy merge.
  //@ n is enough not n+1
  aux = malloc(sizeof(int) * (n));

  if (aux == NULL)
    return;
  
  //@start i from 0, j from n / 2 and k from 0
  int i = 0;
  int j = n/2;
  int k = 0;
  // while (i <= n/2 || j <= n)  
  //@ till k fills the whole array from 0 to n
  while(k<n)
  {
    //@ i condition i>=n/2 not i>n/2 also, j condition j<n not j<=n
    if (i >= n/2 || j < n && array[j] < array[i])
      aux[k++] = array[j++];
    else
      aux[k++] = array[i++];
  }

  //@ now aux has the true values for array, from 0 to n so just loop and copy
  for (i = 0; i < n; i++)
   array[i] = aux[i];

  free(aux);
}
int main(){
  int arr[] = {3,2,6,1,8,9,4,7,5};
  merge_sort(arr,9);
  
  printArr(arr,9,'\n');
  
  return 0;
}
 类似资料:
  • 我试图实现一个递归合并排序算法来排序一个简单的整数数组,但我得到奇怪的值为索引在我的数组的后半部分。前半部分似乎排序精细,这是令人困惑的,因为它是递归实现的。随机整数数组在我的main方法中初始化。 } 这会产生以下输出: 未排序数组={15,9,12,19,49,43,57,70,78,87}对于第1轮:第一个=0中间=4最后=9第1轮中的数组={15,9、12,19、49,43、57,70、7

  • 我写了3个方法来实现递归合并排序,参数数量有限(没有aux、lo、mid、hi)。我认为我的工作是这样的,但它并没有返回一个排序数组,尽管它在运行时没有任何编译错误。我已经摆弄了4个小时,似乎无法弄清楚我做错了什么,没有合并一个有序数组。我只从我的助教那里得到了非常模糊的输入,并且能够修复我正在遇到的一些问题,但是该方法仍然没有对项数组进行排序。欢迎任何关于我在这里做错了什么的建议。谢谢!

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。

  • 我正在尝试编写一个ruby方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

  • 我正在学习计算机科学,我们目前的任务是用2^k (k = 1-16)的数组长度和随机数以及每个位置来编写合并排序算法。我们必须通过合计所有递归数组调用的长度来输出该算法的运行时间。 我们老师举了以下例子:数组长度=4:运行时=2*2 4*1=8 我目前的逻辑是,每个实例都只是数组的长度,这就是为什么我认为在每次递归调用后添加 array.length 就足够了。然而,这发出了太多的调用... 我的

  • 我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?