数组未正确分配

arrays not being assigned properly

本文关键字:分配 数组      更新时间:2023-10-16
void sort(int* A,int l)
{
    int j;
    int B[l];
    for(int i=0;i<l;i++)
    {
        j = largest(A,l);
        B[l-i-1] = A[j];
        A[j] = -1;
    }
    A = B;
 }
  int main()
  {
   .
   int C[3] = {x,y,z};
   ...
    sort(C,3);
     cout<<C[0]<<C[1];
    } 

输出即将变为 -1-1但是,如果我们分配 A[0] = B[0] 等等,那么我们就会得到正确的答案。PS:我尝试使用* A = * B,它只给出了第一个元素是正确的。

当你赋值 A = B 时,你重新赋值一个局部变量,该变量保存指向数组第一个元素的指针。此作业不会更改main中的任何内容。特别是,A的内容不会受到影响。

完成排序后,必须将所有元素从B复制到A

void sort(int *A, int l)
{
    int j;
    int B[l];
    // sort into temporary array B    
    for (int i = 0; i < l; i++) {
        j = largest(A, l);
        B[l - i - 1] = A[j];
        A[j] = -1;
    }
    // copy temporary array B to result array A
    for (int i = 0; i < l; i++) A[i] = B[i];
}

但如果你看一下,Amol Bavannavar 基本上是对的:你不必每次都检查整个数组中最大的元素。检查其余元素就足够了。因此,与其为"使用过的"元素分配一个较低的值,不如将最大的元素交换到最后。当你这样做时,你会看到处理的元素在最后,未处理的元素在开头。然后,您可以就地进行排序,而无需临时数组:

void sort2(int *A, int l)
{
    while (l) {
        int j = largest(A, l--);
        int swap = A[j]; A[j] = A[l]; A[l] = swap;
    }
}

在您的示例中有许多错误的代码用法,例如:

int B[l];

不能做到,如果你这样做,我必须有一个常量值。

A = B;

将执行浅拷贝而不是深拷贝。您可以在此处看到差异:深拷贝和浅拷贝有什么区别?

cout<<C[0]<<C[1];

将打印连接在一起的数字而不进行解析。

至于如何修复此代码,您可能的目标是实现:

#include <iostream>
using namespace std;
int largest(int* A, int l)
{
int big=-1;
int i;
int index=0;
for(i=0;i<l;i++)
{
    if(A[i]>big)
    {
        big=A[i];
        index=i;
    }
}
return index;
}
void sort(int* A,int l)
{
int j;
int *B=new int[l];
for(int i=0;i<l;i++)
{
    j = largest(A,l);
    B[l-i-1] = A[j];
    A[j] = -1;
}
for(int i=0;i<l;i++)
{
    A[i]=B[i];
}
}
int main()
{
 int C[3] = {2,5,1};
 sort(C,3);
 cout<<C[0]<<" "<<C[1];
 return 1;
}