Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不带哨兵的合并排序_C++_Algorithm_Sorting - Fatal编程技术网

C++ 不带哨兵的合并排序

C++ 不带哨兵的合并排序,c++,algorithm,sorting,C++,Algorithm,Sorting,有人能告诉我为什么分类后会得到垃圾值吗? 初始调用是(A,0,n)其中n是数组的大小?我想使用合并排序算法对数组进行排序,但不使用sentinel值 void merge_sort(int A[], int l, int mid, int r) { int n1 = mid - l + 1; int n2 = r - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++) { L[i

有人能告诉我为什么分类后会得到垃圾值吗? 初始调用是
(A,0,n)
其中
n
是数组的大小?我想使用合并排序算法对数组进行排序,但不使用sentinel值

void merge_sort(int A[], int l, int mid, int r)
{
    int n1 = mid - l + 1;
    int n2 = r - mid;

    int L[n1], R[n2];

    for (int i = 0; i < n1; i++)
    {
        L[i] = A[i];
    }

    for (int i = 0; i <= n2; i++)
    {
        R[i] = A[i + mid + 1];
    }
    cout << endl;

    int j = 0, k = 0;

    for (int i = l; i < r; i++)
    {
        if (j == n1 || k == n2)
        {
            if (j == n1 + 1)
            {
                A[i] = R[k];
                k++;
            }
            else
            {
                A[i] = L[j];
                j++;
            }
        }
        else if (L[j] >= R[k])
        {
            A[i] = L[j];
            j++;
        }
        else
        {
            A[i] = R[k];
            k++;
        }
    }
}

void merge_divide(int A[], int l, int r)
{
    if (l < r)
    {
        int mid = (l + r) / 2;
        merge_divide(A, l, mid);
        merge_divide(A, mid + 1, r);
        merge_sort(A, l, mid, r);
    }
}
void merge_排序(int A[],int l,int mid,int r)
{
int n1=中间-l+1;
int n2=r-中间值;
int L[n1],R[n2];
对于(int i=0;i对于(int i=0;i来说,您的逻辑中有很多难以理解的移动。很难区分哪里有错误或这里有什么意图。但这里是我如何看待修复的。请参阅内联注释

void merge_sort(int A[], int l, int mid, int r) {
  int n1 = mid - l;
  int n2 = r - mid;

  // this is C, but not C++, consider using vector instead
  int L[n1], R[n2];

  for (int i = 0; i < n1; i++) {
    // need `l` here
    L[i] = A[l + i];
  }

  for (int i = 0; i < n2; i++) {
    // need to include `mid`
    R[i] = A[i + mid];
  }

  int j = 0, k = 0;

  for (int i = l; i < r; i++) {
    if (j == n1) {
      A[i] = R[k];
      k++;
    } else if (k == n2) {
      A[i] = L[j];
      j++;
    } else if (L[j] >= R[k]) {
      A[i] = L[j];
      j++;
    } else {
      A[i] = R[k];
      k++;
    }
  }
}

void merge_divide(int A[], int l, int r) {
    // need properly compute `mid` here
  int mid = r - l;
  if (mid > 1) {
    mid = l + mid / 2;
    merge_divide(A, l, mid);
    merge_divide(A, mid, r);
    merge_sort(A, l, mid, r);
  }
}

int main() {
  int A[] = {2, 4, 3, 382, 2342334, 3, 42, 234};
  int n = sizeof(A) / sizeof(int);
  merge_divide(A, 0, n);
  for (int i = 0; i < n; ++i)
    cerr << A[i] << " ";
  cout << endl;
}
void merge_排序(int A[],int l,int mid,int r){
int n1=中间-l;
int n2=r-中间值;
//这是C,但不是C++,考虑使用向量代替
int L[n1],R[n2];
对于(int i=0;i=R[k]){
A[i]=L[j];
j++;
}否则{
A[i]=R[k];
k++;
}
}
}
无效合并除法(整数A[],整数l,整数r){
//需要在这里正确计算'mid'
int mid=r-l;
如果(中间>1){
mid=l+mid/2;
合并/分割(A、l、mid);
合并/分割(A、中间、r);
合并排序(A、l、mid、r);
}
}
int main(){
INTA[]={2,4,3,382,2342334,3,42,234};
int n=sizeof(A)/sizeof(int);
合并(A,0,n);;
对于(int i=0;i我注意到的第一件事是,你使用的技术上不是C++语言的一部分。但是一些编译器把它们作为非可移植的扩展来扩展到语言。我建议你用它。如果你想成为一个开发者,程序就不能成为你的黑盒子。换句话说,使用调试器,一步一步地运行你的代码。值并与预期值进行比较。随机
出现了什么问题?部分代码将右子数组的最后一个元素视为
A[r+1]
(第二个
用于
循环),而另一部分代码将其视为
A[r-1]
(第三个
用于
循环)。这可能会导致逻辑错误和未定义的行为。请将
mid+1
的所有实例替换为
mid
。代码正在使用开始和结束(最后1个)索引(例如初始调用,0,n,而不是0,n-1).merge\u sort实际上只是一个合并函数。这意味着
n1=mid-l
我这个解决方案对我有效…谢谢@Yuki..但是我的代码中有什么错误?正如我在回答中所说的,很难说哪里是错误,哪里是正确的逻辑,然后是错误。只要看看我的代码与你的代码之间的差异就知道了(我试图尽可能少地更改代码),考虑内联注释,然后您可以理解您想要的和出错的地方。我认为主要的问题是混淆您计算的索引,然后使用,或者只是完全错误的索引。