阵列没有被正确分配
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];
}
但是,如果你看它,阿莫尔Bavannavar基本上是正确的:你不必检查整个每次最大元素的数组。检查剩余的元素就足够了。因此,您可以将最大的元素交换到最后,而不是将“低”值分配给“used”元素。当你这样做时,你会看到处理过的元素在最后,未处理的元素在开始。然后,你可以做你的排序到位,而不需要一个临时数组:
void sort2(int *A, int l)
{
while (l) {
int j = largest(A, l--);
int swap = A[j]; A[j] = A[l]; A[l] = swap;
}
}
我对这种排序和代码没有感到困扰,我只想知道分配A = B,好吧,我得到了它,谢谢 – Glaedr 2014-12-03 05:53:30
有在你的例子的代码中的许多错误的用法,例如:
int B[l];
不能做,如果你像这样做我必须有一个恒定的价值。
A = B;
将执行浅拷贝而不是深拷贝。 你可以在这里看到之探源:What is the difference between a deep copy and a shallow copy?
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;
}
int B [l]确实有效 – Glaedr 2014-12-02 16:23:29
需要初始化数组'INT B [1];'。试试'int B [l] = {};' – Himanshu 2014-12-02 06:34:08
@Himanshu是真的吗? – 2014-12-02 06:36:59
'A = B'在这里没有做任何明智的事情。从函数返回后,这两个变量都超出范围。您应该将'B'的内容复制到'A'中循环或使用'std :: copy'。 – 2014-12-02 06:37:19